void kernel_dgemm_nn_4x2_vs_lib4(int km, int kn, int kmax, double *A, double *B,
                                 int sdb, double *C, double *D, int alg, int tc,
                                 int td) {
  if (kmax <= 0)
    return;
  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),%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)
cmpl   $0x0,-0xc(%rbp)
jg     113d <kernel_dgemm_nn_4x2_vs_lib4+0x3d>
jmp    1d1f <kernel_dgemm_nn_4x2_vs_lib4+0xc1f>
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    170a <kernel_dgemm_nn_4x2_vs_lib4+0x60a>
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    1197 <kernel_dgemm_nn_4x2_vs_lib4+0x97>
jmp    170f <kernel_dgemm_nn_4x2_vs_lib4+0x60f>
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    188b <kernel_dgemm_nn_4x2_vs_lib4+0x78b>
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    170f <kernel_dgemm_nn_4x2_vs_lib4+0x60f>
cmpl   $0x0,0x20(%rbp)
jne    18a9 <kernel_dgemm_nn_4x2_vs_lib4+0x7a9>
cmpl   $0x0,0x30(%rbp)
jne    18a4 <kernel_dgemm_nn_4x2_vs_lib4+0x7a4>
jmp    1b39 <kernel_dgemm_nn_4x2_vs_lib4+0xa39>
jmp    1c3a <kernel_dgemm_nn_4x2_vs_lib4+0xb3a>
cmpl   $0x0,0x28(%rbp)
jne    193f <kernel_dgemm_nn_4x2_vs_lib4+0x83f>
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xd8(%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,-0xc0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
jmp    19c6 <kernel_dgemm_nn_4x2_vs_lib4+0x8c6>
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  0x20(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
cmpl   $0x1,0x20(%rbp)
jne    1a7d <kernel_dgemm_nn_4x2_vs_lib4+0x97d>
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    1b25 <kernel_dgemm_nn_4x2_vs_lib4+0xa25>
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    1b34 <kernel_dgemm_nn_4x2_vs_lib4+0xa34>
jmp    1b39 <kernel_dgemm_nn_4x2_vs_lib4+0xa39>
jmp    1c3a <kernel_dgemm_nn_4x2_vs_lib4+0xb3a>
cmpl   $0x4,-0x4(%rbp)
jl     1bcd <kernel_dgemm_nn_4x2_vs_lib4+0xacd>
movsd  -0x68(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x18(%rax)
cmpl   $0x2,-0x8(%rbp)
jl     1bc8 <kernel_dgemm_nn_4x2_vs_lib4+0xac8>
movsd  -0x70(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x80(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x90(%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    1c35 <kernel_dgemm_nn_4x2_vs_lib4+0xb35>
movsd  -0x68(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
cmpl   $0x2,-0x8(%rbp)
jl     1c30 <kernel_dgemm_nn_4x2_vs_lib4+0xb30>
movsd  -0x70(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x80(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x30(%rax)
jmp    1c35 <kernel_dgemm_nn_4x2_vs_lib4+0xb35>
jmp    1d1f <kernel_dgemm_nn_4x2_vs_lib4+0xc1f>
cmpl   $0x2,-0x8(%rbp)
jl     1cce <kernel_dgemm_nn_4x2_vs_lib4+0xbce>
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,0x20(%rax)
movsd  -0x80(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x48(%rax)
cmpl   $0x4,-0x4(%rbp)
jl     1cc9 <kernel_dgemm_nn_4x2_vs_lib4+0xbc9>
movsd  -0x98(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x68(%rax)
jmp    1d1a <kernel_dgemm_nn_4x2_vs_lib4+0xc1a>
movsd  -0x68(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x40(%rax)
cmpl   $0x4,-0x4(%rbp)
jl     1d15 <kernel_dgemm_nn_4x2_vs_lib4+0xc15>
movsd  -0x98(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x60(%rax)
jmp    1d1a <kernel_dgemm_nn_4x2_vs_lib4+0xc1a>
jmp    1d1f <kernel_dgemm_nn_4x2_vs_lib4+0xc1f>
add    $0x60,%rsp
pop    %rbp
ret

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