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


x86 assembly (clang, -O0):
<kernel_dgemm_nn_4x2_vs_lib4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%eax
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_4x2_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    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x70(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x18(%rbp)
mov    -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_4x2_vs_lib4+0x88>
jmp    1700 <kernel_dgemm_nn_4x2_vs_lib4+0x600>
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    187c <kernel_dgemm_nn_4x2_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    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1700 <kernel_dgemm_nn_4x2_vs_lib4+0x600>
cmpl   $0x0,0x10(%rbp)
jne    189a <kernel_dgemm_nn_4x2_vs_lib4+0x79a>
cmpl   $0x0,0x30(%rbp)
jne    1895 <kernel_dgemm_nn_4x2_vs_lib4+0x795>
jmp    1b2a <kernel_dgemm_nn_4x2_vs_lib4+0xa2a>
jmp    1c2b <kernel_dgemm_nn_4x2_vs_lib4+0xb2b>
cmpl   $0x0,0x28(%rbp)
jne    1930 <kernel_dgemm_nn_4x2_vs_lib4+0x830>
mov    0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
jmp    19b7 <kernel_dgemm_nn_4x2_vs_lib4+0x8b7>
mov    0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    0x18(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
cmpl   $0x1,0x10(%rbp)
jne    1a6e <kernel_dgemm_nn_4x2_vs_lib4+0x96e>
movsd  -0xa8(%rbp),%xmm0
ff
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0xb8(%rbp),%xmm0
ff
addsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0xc8(%rbp),%xmm0
ff
addsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0xd8(%rbp),%xmm0
ff
addsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
addsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0xc0(%rbp),%xmm0
ff
addsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0xd0(%rbp),%xmm0
ff
addsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0xe0(%rbp),%xmm0
ff
addsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
jmp    1b16 <kernel_dgemm_nn_4x2_vs_lib4+0xa16>
movsd  -0xa8(%rbp),%xmm0
ff
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0xb8(%rbp),%xmm0
ff
subsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0xc8(%rbp),%xmm0
ff
subsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0xd8(%rbp),%xmm0
ff
subsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0xc0(%rbp),%xmm0
ff
subsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0xd0(%rbp),%xmm0
ff
subsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0xe0(%rbp),%xmm0
ff
subsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
cmpl   $0x0,0x30(%rbp)
jne    1b25 <kernel_dgemm_nn_4x2_vs_lib4+0xa25>
jmp    1b2a <kernel_dgemm_nn_4x2_vs_lib4+0xa2a>
jmp    1c2b <kernel_dgemm_nn_4x2_vs_lib4+0xb2b>
cmpl   $0x4,-0x4(%rbp)
jl     1bbe <kernel_dgemm_nn_4x2_vs_lib4+0xabe>
movsd  -0x68(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x20(%rbp),%rax
movsd  %xmm0,0x18(%rax)
cmpl   $0x2,-0x8(%rbp)
jl     1bb9 <kernel_dgemm_nn_4x2_vs_lib4+0xab9>
movsd  -0x70(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x80(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x20(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    0x20(%rbp),%rax
movsd  %xmm0,0x38(%rax)
jmp    1c26 <kernel_dgemm_nn_4x2_vs_lib4+0xb26>
movsd  -0x68(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
cmpl   $0x2,-0x8(%rbp)
jl     1c21 <kernel_dgemm_nn_4x2_vs_lib4+0xb21>
movsd  -0x70(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x80(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x20(%rbp),%rax
movsd  %xmm0,0x30(%rax)
jmp    1c26 <kernel_dgemm_nn_4x2_vs_lib4+0xb26>
jmp    1d10 <kernel_dgemm_nn_4x2_vs_lib4+0xc10>
cmpl   $0x2,-0x8(%rbp)
jl     1cbf <kernel_dgemm_nn_4x2_vs_lib4+0xbbf>
movsd  -0x68(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x80(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x20(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x20(%rbp),%rax
movsd  %xmm0,0x48(%rax)
cmpl   $0x4,-0x4(%rbp)
jl     1cba <kernel_dgemm_nn_4x2_vs_lib4+0xbba>
movsd  -0x98(%rbp),%xmm0
ff
mov    0x20(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    0x20(%rbp),%rax
movsd  %xmm0,0x68(%rax)
jmp    1d0b <kernel_dgemm_nn_4x2_vs_lib4+0xc0b>
movsd  -0x68(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x20(%rbp),%rax
movsd  %xmm0,0x40(%rax)
cmpl   $0x4,-0x4(%rbp)
jl     1d06 <kernel_dgemm_nn_4x2_vs_lib4+0xc06>
movsd  -0x98(%rbp),%xmm0
ff
mov    0x20(%rbp),%rax
movsd  %xmm0,0x60(%rax)
jmp    1d0b <kernel_dgemm_nn_4x2_vs_lib4+0xc0b>
jmp    1d10 <kernel_dgemm_nn_4x2_vs_lib4+0xc10>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dgemm_nn_4x2_vs_lib4>:
push   %r15
push   %r14
push   %rbx
cmp    $0x4,%edx
jl     12f5 <kernel_dgemm_nn_4x2_vs_lib4+0x1f5>
lea    -0x3(%rdx),%r10d
shl    $0x2,%r9d
movslq %r9d,%r9
shl    $0x3,%r9
xorpd  %xmm11,%xmm11
xor    %eax,%eax
xorpd  %xmm0,%xmm0
xorpd  %xmm2,%xmm2
xorpd  %xmm7,%xmm7
movupd (%rcx),%xmm9
movsd  (%r8),%xmm6
movsd  0x8(%r8),%xmm8
movsd  0x10(%r8),%xmm1
movsd  0x18(%r8),%xmm12
movsd  0x20(%r8),%xmm5
movapd %xmm5,%xmm10
movapd %xmm6,%xmm4
unpcklpd %xmm5,%xmm4
unpcklpd %xmm6,%xmm5
unpcklpd %xmm6,%xmm6
mulpd  %xmm9,%xmm6
addpd  %xmm0,%xmm6
unpcklpd %xmm10,%xmm10
mulpd  %xmm9,%xmm10
addpd  %xmm2,%xmm10
movsd  0x10(%rcx),%xmm0
unpcklpd %xmm0,%xmm0
mulpd  %xmm0,%xmm4
addpd  %xmm7,%xmm4
movsd  0x18(%rcx),%xmm0
unpcklpd %xmm0,%xmm0
mulpd  %xmm0,%xmm5
addpd  %xmm11,%xmm5
movupd 0x20(%rcx),%xmm3
movsd  0x28(%r8),%xmm0
movapd %xmm0,%xmm2
movapd %xmm8,%xmm7
unpcklpd %xmm0,%xmm7
unpcklpd %xmm8,%xmm0
unpcklpd %xmm8,%xmm8
mulpd  %xmm3,%xmm8
addpd  %xmm6,%xmm8
unpcklpd %xmm2,%xmm2
mulpd  %xmm3,%xmm2
addpd  %xmm10,%xmm2
movsd  0x30(%rcx),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm3,%xmm7
addpd  %xmm4,%xmm7
movsd  0x38(%rcx),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm3,%xmm0
addpd  %xmm5,%xmm0
movupd 0x40(%rcx),%xmm3
movsd  0x30(%r8),%xmm5
movapd %xmm5,%xmm4
movapd %xmm1,%xmm6
unpcklpd %xmm5,%xmm6
unpcklpd %xmm1,%xmm5
unpcklpd %xmm1,%xmm1
mulpd  %xmm3,%xmm1
addpd  %xmm8,%xmm1
unpcklpd %xmm4,%xmm4
mulpd  %xmm3,%xmm4
addpd  %xmm2,%xmm4
movsd  0x50(%rcx),%xmm2
unpcklpd %xmm2,%xmm2
mulpd  %xmm2,%xmm6
addpd  %xmm7,%xmm6
movsd  0x58(%rcx),%xmm2
unpcklpd %xmm2,%xmm2
mulpd  %xmm2,%xmm5
addpd  %xmm0,%xmm5
movupd 0x60(%rcx),%xmm2
movsd  0x38(%r8),%xmm8
movapd %xmm8,%xmm9
movapd %xmm12,%xmm10
unpcklpd %xmm8,%xmm10
unpcklpd %xmm12,%xmm8
unpcklpd %xmm12,%xmm12
mulpd  %xmm2,%xmm12
movapd %xmm12,%xmm0
addpd  %xmm1,%xmm0
unpcklpd %xmm9,%xmm9
mulpd  %xmm2,%xmm9
movapd %xmm9,%xmm2
addpd  %xmm4,%xmm2
movsd  0x70(%rcx),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm3,%xmm10
movapd %xmm10,%xmm7
addpd  %xmm6,%xmm7
movsd  0x78(%rcx),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm3,%xmm8
movapd %xmm8,%xmm11
addpd  %xmm5,%xmm11
sub    $0xffffffffffffff80,%rcx
add    $0x4,%eax
add    %r9,%r8
cmp    %r10d,%eax
jl     1130 <kernel_dgemm_nn_4x2_vs_lib4+0x30>
addpd  %xmm5,%xmm8
addpd  %xmm6,%xmm10
addpd  %xmm4,%xmm9
addpd  %xmm1,%xmm12
mov    %edx,%eax
and    $0xfffffffc,%eax
jmp    130b <kernel_dgemm_nn_4x2_vs_lib4+0x20b>
xorpd  %xmm8,%xmm8
xor    %eax,%eax
xorpd  %xmm12,%xmm12
xorpd  %xmm9,%xmm9
xorpd  %xmm10,%xmm10
mov    0x20(%rsp),%r9d
cmp    %edx,%eax
jge    13dc <kernel_dgemm_nn_4x2_vs_lib4+0x2dc>
sub    %eax,%edx
xor    %eax,%eax
nopl   0x0(%rax)
movapd %xmm10,%xmm2
movapd %xmm9,%xmm1
movapd %xmm12,%xmm11
movapd %xmm8,%xmm5
movupd (%rcx),%xmm0
movsd  (%r8,%rax,8),%xmm3
movsd  0x20(%r8,%rax,8),%xmm4
movapd %xmm4,%xmm6
movapd %xmm3,%xmm7
unpcklpd %xmm4,%xmm7
unpcklpd %xmm3,%xmm4
unpcklpd %xmm3,%xmm3
mulpd  %xmm0,%xmm3
movapd %xmm3,%xmm12
addpd  %xmm11,%xmm12
unpcklpd %xmm6,%xmm6
mulpd  %xmm0,%xmm6
movapd %xmm6,%xmm9
addpd  %xmm1,%xmm9
movsd  0x10(%rcx),%xmm0
unpcklpd %xmm0,%xmm0
mulpd  %xmm0,%xmm7
movapd %xmm7,%xmm10
addpd  %xmm2,%xmm10
movsd  0x18(%rcx),%xmm0
unpcklpd %xmm0,%xmm0
mulpd  %xmm0,%xmm4
movapd %xmm4,%xmm8
addpd  %xmm5,%xmm8
add    $0x1,%rax
add    $0x20,%rcx
cmp    %eax,%edx
jne    1320 <kernel_dgemm_nn_4x2_vs_lib4+0x220>
addpd  %xmm5,%xmm4
addpd  %xmm2,%xmm7
addpd  %xmm1,%xmm6
addpd  %xmm11,%xmm3
movapd %xmm4,%xmm8
movapd %xmm3,%xmm12
movapd %xmm6,%xmm9
movapd %xmm7,%xmm10
mov    0x40(%rsp),%r8d
mov    0x30(%rsp),%r10
test   %r9d,%r9d
je     147d <kernel_dgemm_nn_4x2_vs_lib4+0x37d>
mov    0x28(%rsp),%rdx
lea    0x8(%rdx),%rcx
cmpl   $0x0,0x38(%rsp)
je     1419 <kernel_dgemm_nn_4x2_vs_lib4+0x319>
mov    %rcx,%r11
lea    0x20(%rdx),%rcx
lea    0x40(%rdx),%r14
lea    0x48(%rdx),%rax
lea    0x60(%rdx),%r15
mov    $0xd,%ebx
jmp    142e <kernel_dgemm_nn_4x2_vs_lib4+0x32e>
lea    0x10(%rdx),%r14
lea    0x18(%rdx),%r15
lea    0x20(%rdx),%r11
lea    0x30(%rdx),%rax
mov    $0x7,%ebx
movsd  (%rdx,%rbx,8),%xmm0
movsd  (%r15),%xmm2
movsd  (%rax),%xmm5
movsd  (%r14),%xmm1
movsd  (%rdx),%xmm6
movsd  0x28(%rdx),%xmm3
movsd  (%rcx),%xmm7
movsd  (%r11),%xmm4
unpcklpd %xmm7,%xmm6
cmp    $0x1,%r9d
jne    14c4 <kernel_dgemm_nn_4x2_vs_lib4+0x3c4>
addpd  %xmm6,%xmm12
unpcklpd %xmm3,%xmm4
addpd  %xmm4,%xmm9
unpcklpd %xmm5,%xmm1
addpd  %xmm1,%xmm10
unpcklpd %xmm2,%xmm0
addpd  %xmm0,%xmm8
test   %r8d,%r8d
je     14fd <kernel_dgemm_nn_4x2_vs_lib4+0x3fd>
movapd %xmm12,%xmm0
unpckhpd %xmm9,%xmm0
movsd  %xmm12,(%r10)
cmp    $0x2,%esi
jl     154d <kernel_dgemm_nn_4x2_vs_lib4+0x44d>
movsd  %xmm9,0x8(%r10)
movupd %xmm0,0x20(%r10)
movupd %xmm10,0x40(%r10)
cmp    $0x3,%edi
jle    1595 <kernel_dgemm_nn_4x2_vs_lib4+0x495>
mov    $0xd,%ecx
mov    $0xc,%edx
jmp    1589 <kernel_dgemm_nn_4x2_vs_lib4+0x489>
subpd  %xmm12,%xmm6
unpcklpd %xmm3,%xmm4
subpd  %xmm9,%xmm4
unpcklpd %xmm5,%xmm1
subpd  %xmm10,%xmm1
unpcklpd %xmm2,%xmm0
subpd  %xmm8,%xmm0
movapd %xmm0,%xmm8
movapd %xmm6,%xmm12
movapd %xmm4,%xmm9
movapd %xmm1,%xmm10
test   %r8d,%r8d
jne    1482 <kernel_dgemm_nn_4x2_vs_lib4+0x382>
movapd %xmm10,%xmm1
movsd  %xmm8,%xmm1
unpckhpd %xmm8,%xmm8
movapd %xmm8,%xmm0
movapd %xmm1,%xmm8
movupd %xmm12,(%r10)
movsd  %xmm10,0x10(%r10)
cmp    $0x4,%edi
jl     156a <kernel_dgemm_nn_4x2_vs_lib4+0x46a>
movsd  %xmm0,0x18(%r10)
cmp    $0x2,%esi
jl     1595 <kernel_dgemm_nn_4x2_vs_lib4+0x495>
movlpd %xmm9,0x20(%r10)
unpckhpd %xmm9,%xmm9
mov    $0x7,%ecx
mov    $0x6,%edx
mov    $0x5,%eax
jmp    1583 <kernel_dgemm_nn_4x2_vs_lib4+0x483>
movlpd %xmm0,0x20(%r10)
movlpd %xmm10,0x40(%r10)
cmp    $0x3,%edi
jle    1595 <kernel_dgemm_nn_4x2_vs_lib4+0x495>
unpckhpd %xmm8,%xmm8
mov    $0xc,%ecx
jmp    158f <kernel_dgemm_nn_4x2_vs_lib4+0x48f>
cmp    $0x1,%esi
jle    1595 <kernel_dgemm_nn_4x2_vs_lib4+0x495>
unpckhpd %xmm9,%xmm8
mov    $0x6,%ecx
mov    $0x5,%edx
mov    $0x4,%eax
movsd  %xmm9,(%r10,%rax,8)
movhpd %xmm8,(%r10,%rdx,8)
movsd  %xmm8,(%r10,%rcx,8)
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define void @kernel_dgemm_nn_4x2_vs_lib4(i32 %0, i32 %1, i32 %2, double* %3, double* %4, i32 %5, i32 %6, double* %7, double* %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 i32
%19 = alloca double*
%20 = alloca double*
%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 i32 %6, i32* %18
store double* %7, double** %19
store double* %8, double** %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** %15
%60 = getelementptr inbounds double, double* %59, i64 2
%61 = load double, double* %60
store double %61, double* %27
%62 = load double*, double** %15
%63 = getelementptr inbounds double, double* %62, i64 3
%64 = load double, double* %63
store double %64, double* %28
%65 = load double*, double** %16
%66 = getelementptr inbounds double, double* %65, i64 0
%67 = load double, double* %66
store double %67, double* %29
%68 = load double*, double** %16
%69 = getelementptr inbounds double, double* %68, i64 4
%70 = load double, double* %69
store double %70, double* %30
%71 = load double, double* %25
%72 = load double, double* %29
%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* %29
%77 = load double, double* %33
%78 = call double @llvm.fmuladd.f64(double %75, double %76, double %77)
store double %78, double* %33
%79 = load double, double* %27
%80 = load double, double* %29
%81 = load double, double* %35
%82 = call double @llvm.fmuladd.f64(double %79, double %80, double %81)
store double %82, double* %35
%83 = load double, double* %28
%84 = load double, double* %29
%85 = load double, double* %37
%86 = call double @llvm.fmuladd.f64(double %83, double %84, double %85)
store double %86, double* %37
%87 = load double, double* %25
%88 = load double, double* %30
%89 = load double, double* %32
%90 = call double @llvm.fmuladd.f64(double %87, double %88, double %89)
store double %90, double* %32
%91 = load double, double* %26
%92 = load double, double* %30
%93 = load double, double* %34
%94 = call double @llvm.fmuladd.f64(double %91, double %92, double %93)
store double %94, double* %34
%95 = load double, double* %27
%96 = load double, double* %30
%97 = load double, double* %36
%98 = call double @llvm.fmuladd.f64(double %95, double %96, double %97)
store double %98, double* %36
%99 = load double, double* %28
%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** %15
%110 = getelementptr inbounds double, double* %109, i64 6
%111 = load double, double* %110
store double %111, double* %27
%112 = load double*, double** %15
%113 = getelementptr inbounds double, double* %112, i64 7
%114 = load double, double* %113
store double %114, double* %28
%115 = load double*, double** %16
%116 = getelementptr inbounds double, double* %115, i64 1
%117 = load double, double* %116
store double %117, double* %29
%118 = load double*, double** %16
%119 = getelementptr inbounds double, double* %118, i64 5
%120 = load double, double* %119
store double %120, double* %30
%121 = load double, double* %25
%122 = load double, double* %29
%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* %29
%127 = load double, double* %33
%128 = call double @llvm.fmuladd.f64(double %125, double %126, double %127)
store double %128, double* %33
%129 = load double, double* %27
%130 = load double, double* %29
%131 = load double, double* %35
%132 = call double @llvm.fmuladd.f64(double %129, double %130, double %131)
store double %132, double* %35
%133 = load double, double* %28
%134 = load double, double* %29
%135 = load double, double* %37
%136 = call double @llvm.fmuladd.f64(double %133, double %134, double %135)
store double %136, double* %37
%137 = load double, double* %25
%138 = load double, double* %30
%139 = load double, double* %32
%140 = call double @llvm.fmuladd.f64(double %137, double %138, double %139)
store double %140, double* %32
%141 = load double, double* %26
%142 = load double, double* %30
%143 = load double, double* %34
%144 = call double @llvm.fmuladd.f64(double %141, double %142, double %143)
store double %144, double* %34
%145 = load double, double* %27
%146 = load double, double* %30
%147 = load double, double* %36
%148 = call double @llvm.fmuladd.f64(double %145, double %146, double %147)
store double %148, double* %36
%149 = load double, double* %28
%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** %15
%160 = getelementptr inbounds double, double* %159, i64 10
%161 = load double, double* %160
store double %161, double* %27
%162 = load double*, double** %15
%163 = getelementptr inbounds double, double* %162, i64 11
%164 = load double, double* %163
store double %164, double* %28
%165 = load double*, double** %16
%166 = getelementptr inbounds double, double* %165, i64 2
%167 = load double, double* %166
store double %167, double* %29
%168 = load double*, double** %16
%169 = getelementptr inbounds double, double* %168, i64 6
%170 = load double, double* %169
store double %170, double* %30
%171 = load double, double* %25
%172 = load double, double* %29
%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* %29
%177 = load double, double* %33
%178 = call double @llvm.fmuladd.f64(double %175, double %176, double %177)
store double %178, double* %33
%179 = load double, double* %27
%180 = load double, double* %29
%181 = load double, double* %35
%182 = call double @llvm.fmuladd.f64(double %179, double %180, double %181)
store double %182, double* %35
%183 = load double, double* %28
%184 = load double, double* %29
%185 = load double, double* %37
%186 = call double @llvm.fmuladd.f64(double %183, double %184, double %185)
store double %186, double* %37
%187 = load double, double* %25
%188 = load double, double* %30
%189 = load double, double* %32
%190 = call double @llvm.fmuladd.f64(double %187, double %188, double %189)
store double %190, double* %32
%191 = load double, double* %26
%192 = load double, double* %30
%193 = load double, double* %34
%194 = call double @llvm.fmuladd.f64(double %191, double %192, double %193)
store double %194, double* %34
%195 = load double, double* %27
%196 = load double, double* %30
%197 = load double, double* %36
%198 = call double @llvm.fmuladd.f64(double %195, double %196, double %197)
store double %198, double* %36
%199 = load double, double* %28
%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** %15
%210 = getelementptr inbounds double, double* %209, i64 14
%211 = load double, double* %210
store double %211, double* %27
%212 = load double*, double** %15
%213 = getelementptr inbounds double, double* %212, i64 15
%214 = load double, double* %213
store double %214, double* %28
%215 = load double*, double** %16
%216 = getelementptr inbounds double, double* %215, i64 3
%217 = load double, double* %216
store double %217, double* %29
%218 = load double*, double** %16
%219 = getelementptr inbounds double, double* %218, i64 7
%220 = load double, double* %219
store double %220, double* %30
%221 = load double, double* %25
%222 = load double, double* %29
%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* %29
%227 = load double, double* %33
%228 = call double @llvm.fmuladd.f64(double %225, double %226, double %227)
store double %228, double* %33
%229 = load double, double* %27
%230 = load double, double* %29
%231 = load double, double* %35
%232 = call double @llvm.fmuladd.f64(double %229, double %230, double %231)
store double %232, double* %35
%233 = load double, double* %28
%234 = load double, double* %29
%235 = load double, double* %37
%236 = call double @llvm.fmuladd.f64(double %233, double %234, double %235)
store double %236, double* %37
%237 = load double, double* %25
%238 = load double, double* %30
%239 = load double, double* %32
%240 = call double @llvm.fmuladd.f64(double %237, double %238, double %239)
store double %240, double* %32
%241 = load double, double* %26
%242 = load double, double* %30
%243 = load double, double* %34
%244 = call double @llvm.fmuladd.f64(double %241, double %242, double %243)
store double %244, double* %34
%245 = load double, double* %27
%246 = load double, double* %30
%247 = load double, double* %36
%248 = call double @llvm.fmuladd.f64(double %245, double %246, double %247)
store double %248, double* %36
%249 = load double, double* %28
%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** %15
%276 = getelementptr inbounds double, double* %275, i64 2
%277 = load double, double* %276
store double %277, double* %27
%278 = load double*, double** %15
%279 = getelementptr inbounds double, double* %278, i64 3
%280 = load double, double* %279
store double %280, double* %28
%281 = load double*, double** %16
%282 = getelementptr inbounds double, double* %281, i64 0
%283 = load double, double* %282
store double %283, double* %29
%284 = load double*, double** %16
%285 = getelementptr inbounds double, double* %284, i64 4
%286 = load double, double* %285
store double %286, double* %30
%287 = load double, double* %25
%288 = load double, double* %29
%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* %29
%293 = load double, double* %33
%294 = call double @llvm.fmuladd.f64(double %291, double %292, double %293)
store double %294, double* %33
%295 = load double, double* %27
%296 = load double, double* %29
%297 = load double, double* %35
%298 = call double @llvm.fmuladd.f64(double %295, double %296, double %297)
store double %298, double* %35
%299 = load double, double* %28
%300 = load double, double* %29
%301 = load double, double* %37
%302 = call double @llvm.fmuladd.f64(double %299, double %300, double %301)
store double %302, double* %37
%303 = load double, double* %25
%304 = load double, double* %30
%305 = load double, double* %32
%306 = call double @llvm.fmuladd.f64(double %303, double %304, double %305)
store double %306, double* %32
%307 = load double, double* %26
%308 = load double, double* %30
%309 = load double, double* %34
%310 = call double @llvm.fmuladd.f64(double %307, double %308, double %309)
store double %310, double* %34
%311 = load double, double* %27
%312 = load double, double* %30
%313 = load double, double* %36
%314 = call double @llvm.fmuladd.f64(double %311, double %312, double %313)
store double %314, double* %36
%315 = load double, double* %28
%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* %18
%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 %501
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** %19
%339 = getelementptr inbounds double, double* %338, i64 0
%340 = load double, double* %339
store double %340, double* %39
%341 = load double*, double** %19
%342 = getelementptr inbounds double, double* %341, i64 1
%343 = load double, double* %342
store double %343, double* %41
%344 = load double*, double** %19
%345 = getelementptr inbounds double, double* %344, i64 2
%346 = load double, double* %345
store double %346, double* %43
%347 = load double*, double** %19
%348 = getelementptr inbounds double, double* %347, i64 3
%349 = load double, double* %348
store double %349, double* %45
%350 = load double*, double** %19
%351 = getelementptr inbounds double, double* %350, i64 4
%352 = load double, double* %351
store double %352, double* %40
%353 = load double*, double** %19
%354 = getelementptr inbounds double, double* %353, i64 5
%355 = load double, double* %354
store double %355, double* %42
%356 = load double*, double** %19
%357 = getelementptr inbounds double, double* %356, i64 6
%358 = load double, double* %357
store double %358, double* %44
%359 = load double*, double** %19
%360 = getelementptr inbounds double, double* %359, i64 7
%361 = load double, double* %360
store double %361, double* %46
br label %387
362: ; preds = %334
%363 = load double*, double** %19
%364 = getelementptr inbounds double, double* %363, i64 0
%365 = load double, double* %364
store double %365, double* %39
%366 = load double*, double** %19
%367 = getelementptr inbounds double, double* %366, i64 1
%368 = load double, double* %367
store double %368, double* %40
%369 = load double*, double** %19
%370 = getelementptr inbounds double, double* %369, i64 4
%371 = load double, double* %370
store double %371, double* %41
%372 = load double*, double** %19
%373 = getelementptr inbounds double, double* %372, i64 5
%374 = load double, double* %373
store double %374, double* %42
%375 = load double*, double** %19
%376 = getelementptr inbounds double, double* %375, i64 8
%377 = load double, double* %376
store double %377, double* %43
%378 = load double*, double** %19
%379 = getelementptr inbounds double, double* %378, i64 9
%380 = load double, double* %379
store double %380, double* %44
%381 = load double*, double** %19
%382 = getelementptr inbounds double, double* %381, i64 12
%383 = load double, double* %382
store double %383, double* %45
%384 = load double*, double** %19
%385 = getelementptr inbounds double, double* %384, i64 13
%386 = load double, double* %385
store double %386, double* %46
br label %387
387: ; preds = %362, %337
%388 = load i32, i32* %18
%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* %41
%395 = load double, double* %33
%396 = fadd double %394, %395
store double %396, double* %33
%397 = load double, double* %43
%398 = load double, double* %35
%399 = fadd double %397, %398
store double %399, double* %35
%400 = load double, double* %45
%401 = load double, double* %37
%402 = fadd double %400, %401
store double %402, double* %37
%403 = load double, double* %40
%404 = load double, double* %32
%405 = fadd double %403, %404
store double %405, double* %32
%406 = load double, double* %42
%407 = load double, double* %34
%408 = fadd double %406, %407
store double %408, double* %34
%409 = load double, double* %44
%410 = load double, double* %36
%411 = fadd double %409, %410
store double %411, double* %36
%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* %41
%420 = load double, double* %33
%421 = fsub double %419, %420
store double %421, double* %33
%422 = load double, double* %43
%423 = load double, double* %35
%424 = fsub double %422, %423
store double %424, double* %35
%425 = load double, double* %45
%426 = load double, double* %37
%427 = fsub double %425, %426
store double %427, double* %37
%428 = load double, double* %40
%429 = load double, double* %32
%430 = fsub double %428, %429
store double %430, double* %32
%431 = load double, double* %42
%432 = load double, double* %34
%433 = fsub double %431, %432
store double %433, double* %34
%434 = load double, double* %44
%435 = load double, double* %36
%436 = fsub double %434, %435
store double %436, double* %36
%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 %501
445: ; preds = %443, %332
%446 = load i32, i32* %12
%447 = icmp sge i32 %446, 4
br i1 %447, label %448, label %477
448: ; preds = %445
%449 = load double, double* %31
%450 = load double*, double** %20
%451 = getelementptr inbounds double, double* %450, i64 0
store double %449, double* %451
%452 = load double, double* %33
%453 = load double*, double** %20
%454 = getelementptr inbounds double, double* %453, i64 1
store double %452, double* %454
%455 = load double, double* %35
%456 = load double*, double** %20
%457 = getelementptr inbounds double, double* %456, i64 2
store double %455, double* %457
%458 = load double, double* %37
%459 = load double*, double** %20
%460 = getelementptr inbounds double, double* %459, i64 3
store double %458, double* %460
%461 = load i32, i32* %13
%462 = icmp sge i32 %461, 2
br i1 %462, label %463, label %476
463: ; preds = %448
%464 = load double, double* %32
%465 = load double*, double** %20
%466 = getelementptr inbounds double, double* %465, i64 4
store double %464, double* %466
%467 = load double, double* %34
%468 = load double*, double** %20
%469 = getelementptr inbounds double, double* %468, i64 5
store double %467, double* %469
%470 = load double, double* %36
%471 = load double*, double** %20
%472 = getelementptr inbounds double, double* %471, i64 6
store double %470, double* %472
%473 = load double, double* %38
%474 = load double*, double** %20
%475 = getelementptr inbounds double, double* %474, i64 7
store double %473, double* %475
br label %476
476: ; preds = %463, %448
br label %500
477: ; preds = %445
%478 = load double, double* %31
%479 = load double*, double** %20
%480 = getelementptr inbounds double, double* %479, i64 0
store double %478, double* %480
%481 = load double, double* %33
%482 = load double*, double** %20
%483 = getelementptr inbounds double, double* %482, i64 1
store double %481, double* %483
%484 = load double, double* %35
%485 = load double*, double** %20
%486 = getelementptr inbounds double, double* %485, i64 2
store double %484, double* %486
%487 = load i32, i32* %13
%488 = icmp sge i32 %487, 2
br i1 %488, label %489, label %499
489: ; preds = %477
%490 = load double, double* %32
%491 = load double*, double** %20
%492 = getelementptr inbounds double, double* %491, i64 4
store double %490, double* %492
%493 = load double, double* %34
%494 = load double*, double** %20
%495 = getelementptr inbounds double, double* %494, i64 5
store double %493, double* %495
%496 = load double, double* %36
%497 = load double*, double** %20
%498 = getelementptr inbounds double, double* %497, i64 6
store double %496, double* %498
br label %499
499: ; preds = %489, %477
br label %500
500: ; preds = %499, %476
br label %551
501: ; preds = %444, %333
%502 = load i32, i32* %13
%503 = icmp sge i32 %502, 2
br i1 %503, label %504, label %533
504: ; preds = %501
%505 = load double, double* %31
%506 = load double*, double** %20
%507 = getelementptr inbounds double, double* %506, i64 0
store double %505, double* %507
%508 = load double, double* %32
%509 = load double*, double** %20
%510 = getelementptr inbounds double, double* %509, i64 1
store double %508, double* %510
%511 = load double, double* %33
%512 = load double*, double** %20
%513 = getelementptr inbounds double, double* %512, i64 4
store double %511, double* %513
%514 = load double, double* %34
%515 = load double*, double** %20
%516 = getelementptr inbounds double, double* %515, i64 5
store double %514, double* %516
%517 = load double, double* %35
%518 = load double*, double** %20
%519 = getelementptr inbounds double, double* %518, i64 8
store double %517, double* %519
%520 = load double, double* %36
%521 = load double*, double** %20
%522 = getelementptr inbounds double, double* %521, i64 9
store double %520, double* %522
%523 = load i32, i32* %12
%524 = icmp sge i32 %523, 4
br i1 %524, label %525, label %532
525: ; preds = %504
%526 = load double, double* %37
%527 = load double*, double** %20
%528 = getelementptr inbounds double, double* %527, i64 12
store double %526, double* %528
%529 = load double, double* %38
%530 = load double*, double** %20
%531 = getelementptr inbounds double, double* %530, i64 13
store double %529, double* %531
br label %532
532: ; preds = %525, %504
br label %550
533: ; preds = %501
%534 = load double, double* %31
%535 = load double*, double** %20
%536 = getelementptr inbounds double, double* %535, i64 0
store double %534, double* %536
%537 = load double, double* %33
%538 = load double*, double** %20
%539 = getelementptr inbounds double, double* %538, i64 4
store double %537, double* %539
%540 = load double, double* %35
%541 = load double*, double** %20
%542 = getelementptr inbounds double, double* %541, i64 8
store double %540, double* %542
%543 = load i32, i32* %12
%544 = icmp sge i32 %543, 4
br i1 %544, label %545, label %549
545: ; preds = %533
%546 = load double, double* %37
%547 = load double*, double** %20
%548 = getelementptr inbounds double, double* %547, i64 12
store double %546, double* %548
br label %549
549: ; preds = %545, %533
br label %550
550: ; preds = %549, %532
br label %551
551: ; preds = %550, %500
ret void
}

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