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


x86 assembly (clang, -O0):
<kernel_dgemm_nn_2x4_vs_lib4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
cmpl   $0x0,-0xc(%rbp)
jg     113d <kernel_dgemm_nn_2x4_vs_lib4+0x3d>
jmp    1d1c <kernel_dgemm_nn_2x4_vs_lib4+0xc1c>
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_2x4_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    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x70(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x18(%rbp)
mov    -0x24(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x2c(%rbp)
jmp    1197 <kernel_dgemm_nn_2x4_vs_lib4+0x97>
jmp    170f <kernel_dgemm_nn_2x4_vs_lib4+0x60f>
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    188b <kernel_dgemm_nn_2x4_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    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    170f <kernel_dgemm_nn_2x4_vs_lib4+0x60f>
cmpl   $0x0,0x20(%rbp)
jne    18a9 <kernel_dgemm_nn_2x4_vs_lib4+0x7a9>
cmpl   $0x0,0x30(%rbp)
jne    18a4 <kernel_dgemm_nn_2x4_vs_lib4+0x7a4>
jmp    1b39 <kernel_dgemm_nn_2x4_vs_lib4+0xa39>
jmp    1c18 <kernel_dgemm_nn_2x4_vs_lib4+0xb18>
cmpl   $0x0,0x28(%rbp)
jne    193f <kernel_dgemm_nn_2x4_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,-0xc8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
jmp    19c6 <kernel_dgemm_nn_2x4_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  0x10(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
cmpl   $0x1,0x20(%rbp)
jne    1a7d <kernel_dgemm_nn_2x4_vs_lib4+0x97d>
movsd  -0xa8(%rbp),%xmm0
ff
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0xc8(%rbp),%xmm0
ff
addsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
addsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0xd0(%rbp),%xmm0
ff
addsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0xb8(%rbp),%xmm0
ff
addsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0xd8(%rbp),%xmm0
ff
addsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
addsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0xe0(%rbp),%xmm0
ff
addsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
jmp    1b25 <kernel_dgemm_nn_2x4_vs_lib4+0xa25>
movsd  -0xa8(%rbp),%xmm0
ff
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0xc8(%rbp),%xmm0
ff
subsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0xd0(%rbp),%xmm0
ff
subsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0xb8(%rbp),%xmm0
ff
subsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0xd8(%rbp),%xmm0
ff
subsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
subsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0xe0(%rbp),%xmm0
ff
subsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
cmpl   $0x0,0x30(%rbp)
jne    1b34 <kernel_dgemm_nn_2x4_vs_lib4+0xa34>
jmp    1b39 <kernel_dgemm_nn_2x4_vs_lib4+0xa39>
jmp    1c18 <kernel_dgemm_nn_2x4_vs_lib4+0xb18>
cmpl   $0x2,-0x4(%rbp)
jl     1bcd <kernel_dgemm_nn_2x4_vs_lib4+0xacd>
movsd  -0x68(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x48(%rax)
cmpl   $0x4,-0x8(%rbp)
jl     1bc8 <kernel_dgemm_nn_2x4_vs_lib4+0xac8>
movsd  -0x80(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x68(%rax)
jmp    1c13 <kernel_dgemm_nn_2x4_vs_lib4+0xb13>
movsd  -0x68(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x40(%rax)
cmpl   $0x4,-0x8(%rbp)
jl     1c0e <kernel_dgemm_nn_2x4_vs_lib4+0xb0e>
movsd  -0x80(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x60(%rax)
jmp    1c13 <kernel_dgemm_nn_2x4_vs_lib4+0xb13>
jmp    1d1c <kernel_dgemm_nn_2x4_vs_lib4+0xc1c>
cmpl   $0x4,-0x8(%rbp)
jl     1cac <kernel_dgemm_nn_2x4_vs_lib4+0xbac>
movsd  -0x68(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x80(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x18(%rax)
cmpl   $0x2,-0x4(%rbp)
jl     1ca7 <kernel_dgemm_nn_2x4_vs_lib4+0xba7>
movsd  -0x88(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x38(%rax)
jmp    1d17 <kernel_dgemm_nn_2x4_vs_lib4+0xc17>
movsd  -0x68(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
cmpl   $0x2,-0x4(%rbp)
jl     1d12 <kernel_dgemm_nn_2x4_vs_lib4+0xc12>
movsd  -0x88(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x30(%rax)
jmp    1d17 <kernel_dgemm_nn_2x4_vs_lib4+0xc17>
jmp    1d1c <kernel_dgemm_nn_2x4_vs_lib4+0xc1c>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dgemm_nn_2x4_vs_lib4>:
push   %r15
push   %r14
push   %rbx
test   %edx,%edx
jle    155c <kernel_dgemm_nn_2x4_vs_lib4+0x45c>
cmp    $0x4,%edx
jb     12c7 <kernel_dgemm_nn_2x4_vs_lib4+0x1c7>
lea    -0x3(%rdx),%r10d
shl    $0x2,%r9d
movslq %r9d,%r9
shl    $0x3,%r9
xorpd  %xmm7,%xmm7
xor    %eax,%eax
xorpd  %xmm2,%xmm2
xorpd  %xmm3,%xmm3
xorpd  %xmm1,%xmm1
nopw   0x0(%rax,%rax,1)
movupd (%rcx),%xmm5
movupd 0x20(%rcx),%xmm11
movupd 0x40(%rcx),%xmm10
movupd 0x60(%rcx),%xmm8
movsd  (%r8),%xmm6
movsd  0x8(%r8),%xmm0
movsd  0x10(%r8),%xmm4
movsd  0x18(%r8),%xmm9
unpcklpd %xmm6,%xmm6
mulpd  %xmm5,%xmm6
addpd  %xmm1,%xmm6
movsd  0x20(%r8),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm5,%xmm1
addpd  %xmm2,%xmm1
movsd  0x40(%r8),%xmm2
unpcklpd %xmm2,%xmm2
mulpd  %xmm5,%xmm2
addpd  %xmm3,%xmm2
movsd  0x60(%r8),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm5,%xmm3
addpd  %xmm7,%xmm3
unpcklpd %xmm0,%xmm0
mulpd  %xmm11,%xmm0
addpd  %xmm6,%xmm0
movsd  0x28(%r8),%xmm7
unpcklpd %xmm7,%xmm7
mulpd  %xmm11,%xmm7
addpd  %xmm1,%xmm7
movsd  0x48(%r8),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm11,%xmm1
addpd  %xmm2,%xmm1
movsd  0x68(%r8),%xmm2
unpcklpd %xmm2,%xmm2
mulpd  %xmm11,%xmm2
addpd  %xmm3,%xmm2
unpcklpd %xmm4,%xmm4
mulpd  %xmm10,%xmm4
addpd  %xmm0,%xmm4
movsd  0x30(%r8),%xmm6
unpcklpd %xmm6,%xmm6
mulpd  %xmm10,%xmm6
addpd  %xmm7,%xmm6
movsd  0x50(%r8),%xmm5
unpcklpd %xmm5,%xmm5
mulpd  %xmm10,%xmm5
addpd  %xmm1,%xmm5
movsd  0x70(%r8),%xmm0
unpcklpd %xmm0,%xmm0
mulpd  %xmm10,%xmm0
addpd  %xmm2,%xmm0
unpcklpd %xmm9,%xmm9
mulpd  %xmm8,%xmm9
movapd %xmm9,%xmm1
addpd  %xmm4,%xmm1
movsd  0x38(%r8),%xmm11
unpcklpd %xmm11,%xmm11
mulpd  %xmm8,%xmm11
movapd %xmm11,%xmm2
addpd  %xmm6,%xmm2
movsd  0x58(%r8),%xmm12
unpcklpd %xmm12,%xmm12
mulpd  %xmm8,%xmm12
movapd %xmm12,%xmm3
addpd  %xmm5,%xmm3
movsd  0x78(%r8),%xmm10
unpcklpd %xmm10,%xmm10
mulpd  %xmm8,%xmm10
movapd %xmm10,%xmm7
addpd  %xmm0,%xmm7
sub    $0xffffffffffffff80,%rcx
add    $0x4,%eax
add    %r9,%r8
cmp    %r10d,%eax
jl     1140 <kernel_dgemm_nn_2x4_vs_lib4+0x40>
addpd  %xmm0,%xmm10
addpd  %xmm5,%xmm12
addpd  %xmm6,%xmm11
addpd  %xmm4,%xmm9
mov    %edx,%eax
and    $0xfffffffc,%eax
jmp    12dd <kernel_dgemm_nn_2x4_vs_lib4+0x1dd>
xorpd  %xmm10,%xmm10
xor    %eax,%eax
xorpd  %xmm11,%xmm11
xorpd  %xmm12,%xmm12
xorpd  %xmm9,%xmm9
mov    0x30(%rsp),%r9d
cmp    %edx,%eax
jge    13a0 <kernel_dgemm_nn_2x4_vs_lib4+0x2a0>
sub    %eax,%edx
xor    %eax,%eax
xchg   %ax,%ax
movapd %xmm9,%xmm8
movapd %xmm12,%xmm3
movapd %xmm11,%xmm2
movapd %xmm10,%xmm6
movupd (%rcx),%xmm1
movsd  (%r8,%rax,8),%xmm0
movsd  0x20(%r8,%rax,8),%xmm4
movsd  0x40(%r8,%rax,8),%xmm5
movsd  0x60(%r8,%rax,8),%xmm7
unpcklpd %xmm0,%xmm0
mulpd  %xmm1,%xmm0
movapd %xmm0,%xmm9
addpd  %xmm8,%xmm9
unpcklpd %xmm4,%xmm4
mulpd  %xmm1,%xmm4
movapd %xmm4,%xmm11
addpd  %xmm2,%xmm11
unpcklpd %xmm5,%xmm5
mulpd  %xmm1,%xmm5
movapd %xmm5,%xmm12
addpd  %xmm3,%xmm12
unpcklpd %xmm7,%xmm7
mulpd  %xmm1,%xmm7
movapd %xmm7,%xmm10
addpd  %xmm6,%xmm10
add    $0x20,%rcx
add    $0x1,%rax
cmp    %eax,%edx
jne    12f0 <kernel_dgemm_nn_2x4_vs_lib4+0x1f0>
addpd  %xmm6,%xmm7
addpd  %xmm3,%xmm5
addpd  %xmm2,%xmm4
addpd  %xmm8,%xmm0
movapd %xmm7,%xmm10
movapd %xmm4,%xmm11
movapd %xmm5,%xmm12
movapd %xmm0,%xmm9
mov    0x40(%rsp),%r8d
mov    0x28(%rsp),%r10
test   %r9d,%r9d
je     1445 <kernel_dgemm_nn_2x4_vs_lib4+0x345>
mov    0x20(%rsp),%rdx
lea    0x8(%rdx),%rcx
cmpl   $0x0,0x38(%rsp)
je     13dd <kernel_dgemm_nn_2x4_vs_lib4+0x2dd>
lea    0x10(%rdx),%r11
lea    0x18(%rdx),%r14
mov    %rcx,%r15
lea    0x20(%rdx),%rcx
lea    0x30(%rdx),%rbx
mov    $0x7,%eax
jmp    13f2 <kernel_dgemm_nn_2x4_vs_lib4+0x2f2>
lea    0x20(%rdx),%r15
lea    0x40(%rdx),%r11
lea    0x48(%rdx),%rbx
lea    0x60(%rdx),%r14
mov    $0xd,%eax
movsd  (%rdx,%rax,8),%xmm0
movsd  (%rbx),%xmm4
movsd  (%rdx),%xmm3
movsd  0x28(%rdx),%xmm6
movsd  (%rcx),%xmm7
movsd  (%r14),%xmm1
movsd  (%r11),%xmm2
movsd  (%r15),%xmm5
unpcklpd %xmm7,%xmm3
cmp    $0x1,%r9d
jne    14b9 <kernel_dgemm_nn_2x4_vs_lib4+0x3b9>
addpd  %xmm3,%xmm9
unpcklpd %xmm6,%xmm5
addpd  %xmm5,%xmm11
unpcklpd %xmm4,%xmm2
addpd  %xmm2,%xmm12
unpcklpd %xmm0,%xmm1
addpd  %xmm1,%xmm10
test   %r8d,%r8d
je     14f6 <kernel_dgemm_nn_2x4_vs_lib4+0x3f6>
movapd %xmm12,%xmm2
unpckhpd %xmm10,%xmm2
movapd %xmm11,%xmm4
unpckhpd %xmm11,%xmm4
movapd %xmm9,%xmm1
unpckhpd %xmm9,%xmm1
movapd %xmm10,%xmm0
movapd %xmm2,%xmm10
movsd  %xmm9,(%r10)
movsd  %xmm11,0x8(%r10)
movsd  %xmm12,0x10(%r10)
cmp    $0x4,%esi
jl     1523 <kernel_dgemm_nn_2x4_vs_lib4+0x423>
movsd  %xmm0,0x18(%r10)
cmp    $0x2,%edi
jl     155c <kernel_dgemm_nn_2x4_vs_lib4+0x45c>
movsd  %xmm1,0x20(%r10)
mov    $0x7,%ecx
mov    $0x6,%eax
mov    $0x5,%edx
jmp    1545 <kernel_dgemm_nn_2x4_vs_lib4+0x445>
subpd  %xmm9,%xmm3
unpcklpd %xmm6,%xmm5
subpd  %xmm11,%xmm5
unpcklpd %xmm4,%xmm2
subpd  %xmm12,%xmm2
unpcklpd %xmm0,%xmm1
subpd  %xmm10,%xmm1
movapd %xmm1,%xmm10
movapd %xmm5,%xmm11
movapd %xmm2,%xmm12
movapd %xmm3,%xmm9
test   %r8d,%r8d
jne    144e <kernel_dgemm_nn_2x4_vs_lib4+0x34e>
movlpd %xmm9,(%r10)
cmp    $0x2,%edi
jl     1562 <kernel_dgemm_nn_2x4_vs_lib4+0x462>
movhpd %xmm9,0x8(%r10)
movupd %xmm11,0x20(%r10)
movupd %xmm12,0x40(%r10)
cmp    $0x3,%esi
jle    155c <kernel_dgemm_nn_2x4_vs_lib4+0x45c>
mov    $0xd,%ecx
mov    $0xc,%eax
jmp    154b <kernel_dgemm_nn_2x4_vs_lib4+0x44b>
cmp    $0x2,%edi
jl     155c <kernel_dgemm_nn_2x4_vs_lib4+0x45c>
unpcklpd %xmm10,%xmm4
mov    $0x6,%ecx
mov    $0x5,%eax
mov    $0x4,%edx
movapd %xmm4,%xmm10
movapd %xmm1,%xmm4
movsd  %xmm4,(%r10,%rdx,8)
movlpd %xmm10,(%r10,%rax,8)
unpckhpd %xmm10,%xmm10
movsd  %xmm10,(%r10,%rcx,8)
pop    %rbx
pop    %r14
pop    %r15
ret
movlpd %xmm11,0x20(%r10)
movlpd %xmm12,0x40(%r10)
cmp    $0x3,%esi
jle    155c <kernel_dgemm_nn_2x4_vs_lib4+0x45c>
mov    $0xc,%ecx
jmp    1556 <kernel_dgemm_nn_2x4_vs_lib4+0x456>

LLVM IR (-O0):
define void @kernel_dgemm_nn_2x4_vs_lib4(i32 %0, i32 %1, i32 %2, double* %3, double* %4, i32 %5, double* %6, double* %7, i32 %8, i32 %9, i32 %10) {
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca double*
%16 = alloca double*
%17 = alloca i32
%18 = alloca double*
%19 = alloca double*
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
%25 = alloca double
%26 = alloca double
%27 = alloca double
%28 = alloca double
%29 = alloca double
%30 = alloca double
%31 = alloca double
%32 = alloca double
%33 = alloca double
%34 = alloca double
%35 = alloca double
%36 = alloca double
%37 = alloca double
%38 = alloca double
%39 = alloca double
%40 = alloca double
%41 = alloca double
%42 = alloca double
%43 = alloca double
%44 = alloca double
%45 = alloca double
%46 = alloca double
store i32 %0, i32* %12
store i32 %1, i32* %13
store i32 %2, i32* %14
store double* %3, double** %15
store double* %4, double** %16
store i32 %5, i32* %17
store double* %6, double** %18
store double* %7, double** %19
store i32 %8, i32* %20
store i32 %9, i32* %21
store i32 %10, i32* %22
%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** %16
%64 = getelementptr inbounds double, double* %63, i64 0
%65 = load double, double* %64
store double %65, double* %27
%66 = load double*, double** %16
%67 = getelementptr inbounds double, double* %66, i64 4
%68 = load double, double* %67
store double %68, double* %28
%69 = load double*, double** %16
%70 = getelementptr inbounds double, double* %69, i64 8
%71 = load double, double* %70
store double %71, double* %29
%72 = load double*, double** %16
%73 = getelementptr inbounds double, double* %72, i64 12
%74 = load double, double* %73
store double %74, double* %30
%75 = load double, double* %25
%76 = load double, double* %27
%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* %27
%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* %25
%84 = load double, double* %28
%85 = load double, double* %32
%86 = call double @llvm.fmuladd.f64(double %83, double %84, double %85)
store double %86, double* %32
%87 = load double, double* %26
%88 = load double, double* %28
%89 = load double, double* %36
%90 = call double @llvm.fmuladd.f64(double %87, double %88, double %89)
store double %90, double* %36
%91 = load double, double* %25
%92 = load double, double* %29
%93 = load double, double* %33
%94 = call double @llvm.fmuladd.f64(double %91, double %92, double %93)
store double %94, double* %33
%95 = load double, double* %26
%96 = load double, double* %29
%97 = load double, double* %37
%98 = call double @llvm.fmuladd.f64(double %95, double %96, double %97)
store double %98, double* %37
%99 = load double, double* %25
%100 = load double, double* %30
%101 = load double, double* %34
%102 = call double @llvm.fmuladd.f64(double %99, double %100, double %101)
store double %102, double* %34
%103 = load double, double* %26
%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** %16
%114 = getelementptr inbounds double, double* %113, i64 1
%115 = load double, double* %114
store double %115, double* %27
%116 = load double*, double** %16
%117 = getelementptr inbounds double, double* %116, i64 5
%118 = load double, double* %117
store double %118, double* %28
%119 = load double*, double** %16
%120 = getelementptr inbounds double, double* %119, i64 9
%121 = load double, double* %120
store double %121, double* %29
%122 = load double*, double** %16
%123 = getelementptr inbounds double, double* %122, i64 13
%124 = load double, double* %123
store double %124, double* %30
%125 = load double, double* %25
%126 = load double, double* %27
%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* %27
%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* %25
%134 = load double, double* %28
%135 = load double, double* %32
%136 = call double @llvm.fmuladd.f64(double %133, double %134, double %135)
store double %136, double* %32
%137 = load double, double* %26
%138 = load double, double* %28
%139 = load double, double* %36
%140 = call double @llvm.fmuladd.f64(double %137, double %138, double %139)
store double %140, double* %36
%141 = load double, double* %25
%142 = load double, double* %29
%143 = load double, double* %33
%144 = call double @llvm.fmuladd.f64(double %141, double %142, double %143)
store double %144, double* %33
%145 = load double, double* %26
%146 = load double, double* %29
%147 = load double, double* %37
%148 = call double @llvm.fmuladd.f64(double %145, double %146, double %147)
store double %148, double* %37
%149 = load double, double* %25
%150 = load double, double* %30
%151 = load double, double* %34
%152 = call double @llvm.fmuladd.f64(double %149, double %150, double %151)
store double %152, double* %34
%153 = load double, double* %26
%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** %16
%164 = getelementptr inbounds double, double* %163, i64 2
%165 = load double, double* %164
store double %165, double* %27
%166 = load double*, double** %16
%167 = getelementptr inbounds double, double* %166, i64 6
%168 = load double, double* %167
store double %168, double* %28
%169 = load double*, double** %16
%170 = getelementptr inbounds double, double* %169, i64 10
%171 = load double, double* %170
store double %171, double* %29
%172 = load double*, double** %16
%173 = getelementptr inbounds double, double* %172, i64 14
%174 = load double, double* %173
store double %174, double* %30
%175 = load double, double* %25
%176 = load double, double* %27
%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* %27
%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* %25
%184 = load double, double* %28
%185 = load double, double* %32
%186 = call double @llvm.fmuladd.f64(double %183, double %184, double %185)
store double %186, double* %32
%187 = load double, double* %26
%188 = load double, double* %28
%189 = load double, double* %36
%190 = call double @llvm.fmuladd.f64(double %187, double %188, double %189)
store double %190, double* %36
%191 = load double, double* %25
%192 = load double, double* %29
%193 = load double, double* %33
%194 = call double @llvm.fmuladd.f64(double %191, double %192, double %193)
store double %194, double* %33
%195 = load double, double* %26
%196 = load double, double* %29
%197 = load double, double* %37
%198 = call double @llvm.fmuladd.f64(double %195, double %196, double %197)
store double %198, double* %37
%199 = load double, double* %25
%200 = load double, double* %30
%201 = load double, double* %34
%202 = call double @llvm.fmuladd.f64(double %199, double %200, double %201)
store double %202, double* %34
%203 = load double, double* %26
%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** %16
%214 = getelementptr inbounds double, double* %213, i64 3
%215 = load double, double* %214
store double %215, double* %27
%216 = load double*, double** %16
%217 = getelementptr inbounds double, double* %216, i64 7
%218 = load double, double* %217
store double %218, double* %28
%219 = load double*, double** %16
%220 = getelementptr inbounds double, double* %219, i64 11
%221 = load double, double* %220
store double %221, double* %29
%222 = load double*, double** %16
%223 = getelementptr inbounds double, double* %222, i64 15
%224 = load double, double* %223
store double %224, double* %30
%225 = load double, double* %25
%226 = load double, double* %27
%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* %27
%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* %25
%234 = load double, double* %28
%235 = load double, double* %32
%236 = call double @llvm.fmuladd.f64(double %233, double %234, double %235)
store double %236, double* %32
%237 = load double, double* %26
%238 = load double, double* %28
%239 = load double, double* %36
%240 = call double @llvm.fmuladd.f64(double %237, double %238, double %239)
store double %240, double* %36
%241 = load double, double* %25
%242 = load double, double* %29
%243 = load double, double* %33
%244 = call double @llvm.fmuladd.f64(double %241, double %242, double %243)
store double %244, double* %33
%245 = load double, double* %26
%246 = load double, double* %29
%247 = load double, double* %37
%248 = call double @llvm.fmuladd.f64(double %245, double %246, double %247)
store double %248, double* %37
%249 = load double, double* %25
%250 = load double, double* %30
%251 = load double, double* %34
%252 = call double @llvm.fmuladd.f64(double %249, double %250, double %251)
store double %252, double* %34
%253 = load double, double* %26
%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** %16
%280 = getelementptr inbounds double, double* %279, i64 0
%281 = load double, double* %280
store double %281, double* %27
%282 = load double*, double** %16
%283 = getelementptr inbounds double, double* %282, i64 4
%284 = load double, double* %283
store double %284, double* %28
%285 = load double*, double** %16
%286 = getelementptr inbounds double, double* %285, i64 8
%287 = load double, double* %286
store double %287, double* %29
%288 = load double*, double** %16
%289 = getelementptr inbounds double, double* %288, i64 12
%290 = load double, double* %289
store double %290, double* %30
%291 = load double, double* %25
%292 = load double, double* %27
%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* %27
%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* %25
%300 = load double, double* %28
%301 = load double, double* %32
%302 = call double @llvm.fmuladd.f64(double %299, double %300, double %301)
store double %302, double* %32
%303 = load double, double* %26
%304 = load double, double* %28
%305 = load double, double* %36
%306 = call double @llvm.fmuladd.f64(double %303, double %304, double %305)
store double %306, double* %36
%307 = load double, double* %25
%308 = load double, double* %29
%309 = load double, double* %33
%310 = call double @llvm.fmuladd.f64(double %307, double %308, double %309)
store double %310, double* %33
%311 = load double, double* %26
%312 = load double, double* %29
%313 = load double, double* %37
%314 = call double @llvm.fmuladd.f64(double %311, double %312, double %313)
store double %314, double* %37
%315 = load double, double* %25
%316 = load double, double* %30
%317 = load double, double* %34
%318 = call double @llvm.fmuladd.f64(double %315, double %316, double %317)
store double %318, double* %34
%319 = load double, double* %26
%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 %499
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* %43
%348 = load double*, double** %18
%349 = getelementptr inbounds double, double* %348, i64 4
%350 = load double, double* %349
store double %350, double* %40
%351 = load double*, double** %18
%352 = getelementptr inbounds double, double* %351, i64 5
%353 = load double, double* %352
store double %353, double* %44
%354 = load double*, double** %18
%355 = getelementptr inbounds double, double* %354, i64 8
%356 = load double, double* %355
store double %356, double* %41
%357 = load double*, double** %18
%358 = getelementptr inbounds double, double* %357, i64 9
%359 = load double, double* %358
store double %359, double* %45
%360 = load double*, double** %18
%361 = getelementptr inbounds double, double* %360, i64 12
%362 = load double, double* %361
store double %362, double* %42
%363 = load double*, double** %18
%364 = getelementptr inbounds double, double* %363, i64 13
%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 2
%375 = load double, double* %374
store double %375, double* %41
%376 = load double*, double** %18
%377 = getelementptr inbounds double, double* %376, i64 3
%378 = load double, double* %377
store double %378, double* %42
%379 = load double*, double** %18
%380 = getelementptr inbounds double, double* %379, i64 4
%381 = load double, double* %380
store double %381, double* %43
%382 = load double*, double** %18
%383 = getelementptr inbounds double, double* %382, i64 5
%384 = load double, double* %383
store double %384, double* %44
%385 = load double*, double** %18
%386 = getelementptr inbounds double, double* %385, i64 6
%387 = load double, double* %386
store double %387, double* %45
%388 = load double*, double** %18
%389 = getelementptr inbounds double, double* %388, i64 7
%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* %43
%399 = load double, double* %35
%400 = fadd double %398, %399
store double %400, double* %35
%401 = load double, double* %40
%402 = load double, double* %32
%403 = fadd double %401, %402
store double %403, double* %32
%404 = load double, double* %44
%405 = load double, double* %36
%406 = fadd double %404, %405
store double %406, double* %36
%407 = load double, double* %41
%408 = load double, double* %33
%409 = fadd double %407, %408
store double %409, double* %33
%410 = load double, double* %45
%411 = load double, double* %37
%412 = fadd double %410, %411
store double %412, double* %37
%413 = load double, double* %42
%414 = load double, double* %34
%415 = fadd double %413, %414
store double %415, double* %34
%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* %43
%424 = load double, double* %35
%425 = fsub double %423, %424
store double %425, double* %35
%426 = load double, double* %40
%427 = load double, double* %32
%428 = fsub double %426, %427
store double %428, double* %32
%429 = load double, double* %44
%430 = load double, double* %36
%431 = fsub double %429, %430
store double %431, double* %36
%432 = load double, double* %41
%433 = load double, double* %33
%434 = fsub double %432, %433
store double %434, double* %33
%435 = load double, double* %45
%436 = load double, double* %37
%437 = fsub double %435, %436
store double %437, double* %37
%438 = load double, double* %42
%439 = load double, double* %34
%440 = fsub double %438, %439
store double %440, double* %34
%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 %499
449: ; preds = %447, %336
%450 = load i32, i32* %12
%451 = icmp sge i32 %450, 2
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* %35
%457 = load double*, double** %19
%458 = getelementptr inbounds double, double* %457, i64 1
store double %456, double* %458
%459 = load double, double* %32
%460 = load double*, double** %19
%461 = getelementptr inbounds double, double* %460, i64 4
store double %459, double* %461
%462 = load double, double* %36
%463 = load double*, double** %19
%464 = getelementptr inbounds double, double* %463, i64 5
store double %462, double* %464
%465 = load double, double* %33
%466 = load double*, double** %19
%467 = getelementptr inbounds double, double* %466, i64 8
store double %465, double* %467
%468 = load double, double* %37
%469 = load double*, double** %19
%470 = getelementptr inbounds double, double* %469, i64 9
store double %468, double* %470
%471 = load i32, i32* %13
%472 = icmp sge i32 %471, 4
br i1 %472, label %473, label %480
473: ; preds = %452
%474 = load double, double* %34
%475 = load double*, double** %19
%476 = getelementptr inbounds double, double* %475, i64 12
store double %474, double* %476
%477 = load double, double* %38
%478 = load double*, double** %19
%479 = getelementptr inbounds double, double* %478, i64 13
store double %477, double* %479
br label %480
480: ; preds = %473, %452
br label %498
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* %32
%486 = load double*, double** %19
%487 = getelementptr inbounds double, double* %486, i64 4
store double %485, double* %487
%488 = load double, double* %33
%489 = load double*, double** %19
%490 = getelementptr inbounds double, double* %489, i64 8
store double %488, double* %490
%491 = load i32, i32* %13
%492 = icmp sge i32 %491, 4
br i1 %492, label %493, label %497
493: ; preds = %481
%494 = load double, double* %34
%495 = load double*, double** %19
%496 = getelementptr inbounds double, double* %495, i64 12
store double %494, double* %496
br label %497
497: ; preds = %493, %481
br label %498
498: ; preds = %497, %480
br label %555
499: ; preds = %448, %337
%500 = load i32, i32* %13
%501 = icmp sge i32 %500, 4
br i1 %501, label %502, label %531
502: ; preds = %499
%503 = load double, double* %31
%504 = load double*, double** %19
%505 = getelementptr inbounds double, double* %504, i64 0
store double %503, double* %505
%506 = load double, double* %32
%507 = load double*, double** %19
%508 = getelementptr inbounds double, double* %507, i64 1
store double %506, double* %508
%509 = load double, double* %33
%510 = load double*, double** %19
%511 = getelementptr inbounds double, double* %510, i64 2
store double %509, double* %511
%512 = load double, double* %34
%513 = load double*, double** %19
%514 = getelementptr inbounds double, double* %513, i64 3
store double %512, double* %514
%515 = load i32, i32* %12
%516 = icmp sge i32 %515, 2
br i1 %516, label %517, label %530
517: ; preds = %502
%518 = load double, double* %35
%519 = load double*, double** %19
%520 = getelementptr inbounds double, double* %519, i64 4
store double %518, double* %520
%521 = load double, double* %36
%522 = load double*, double** %19
%523 = getelementptr inbounds double, double* %522, i64 5
store double %521, double* %523
%524 = load double, double* %37
%525 = load double*, double** %19
%526 = getelementptr inbounds double, double* %525, i64 6
store double %524, double* %526
%527 = load double, double* %38
%528 = load double*, double** %19
%529 = getelementptr inbounds double, double* %528, i64 7
store double %527, double* %529
br label %530
530: ; preds = %517, %502
br label %554
531: ; preds = %499
%532 = load double, double* %31
%533 = load double*, double** %19
%534 = getelementptr inbounds double, double* %533, i64 0
store double %532, double* %534
%535 = load double, double* %32
%536 = load double*, double** %19
%537 = getelementptr inbounds double, double* %536, i64 1
store double %535, double* %537
%538 = load double, double* %33
%539 = load double*, double** %19
%540 = getelementptr inbounds double, double* %539, i64 2
store double %538, double* %540
%541 = load i32, i32* %12
%542 = icmp sge i32 %541, 2
br i1 %542, label %543, label %553
543: ; preds = %531
%544 = load double, double* %35
%545 = load double*, double** %19
%546 = getelementptr inbounds double, double* %545, i64 4
store double %544, double* %546
%547 = load double, double* %36
%548 = load double*, double** %19
%549 = getelementptr inbounds double, double* %548, i64 5
store double %547, double* %549
%550 = load double, double* %37
%551 = load double*, double** %19
%552 = getelementptr inbounds double, double* %551, i64 6
store double %550, double* %552
br label %553
553: ; preds = %543, %531
br label %554
554: ; preds = %553, %530
br label %555
555: ; preds = %554, %498, %49
ret void
}

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