void kernel_dgemm_nt_4x2_unpack_lib(int kmax, double *A, int lda, double *B,
                                    int ldb, double *C, int ldc, double *D,
                                    int ldd, int alg, int tc, int td) {
  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 + lda * 0];
    a_1 = A[1 + lda * 0];
    a_2 = A[2 + lda * 0];
    a_3 = A[3 + lda * 0];
    b_0 = B[0 + ldb * 0];
    b_1 = B[1 + ldb * 0];
    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 + lda * 1];
    a_1 = A[1 + lda * 1];
    a_2 = A[2 + lda * 1];
    a_3 = A[3 + lda * 1];
    b_0 = B[0 + ldb * 1];
    b_1 = B[1 + ldb * 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 + lda * 2];
    a_1 = A[1 + lda * 2];
    a_2 = A[2 + lda * 2];
    a_3 = A[3 + lda * 2];
    b_0 = B[0 + ldb * 2];
    b_1 = B[1 + ldb * 2];
    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 + lda * 3];
    a_1 = A[1 + lda * 3];
    a_2 = A[2 + lda * 3];
    a_3 = A[3 + lda * 3];
    b_0 = B[0 + ldb * 3];
    b_1 = B[1 + ldb * 3];
    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 * lda;
    B += 4 * ldb;
  }
  for (; k < kmax; k++) {
    a_0 = A[0 + lda * 0];
    a_1 = A[1 + lda * 0];
    a_2 = A[2 + lda * 0];
    a_3 = A[3 + lda * 0];
    b_0 = B[0 + ldb * 0];
    b_1 = B[1 + ldb * 0];
    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 += 1 * lda;
    B += 1 * ldb;
  }
  double d_00, d_01, d_10, d_11, d_20, d_21, d_30, d_31;
  if (alg == 0) {
    goto store;
  } else {
    d_00 = C[0 + ldc * 0];
    d_10 = C[1 + ldc * 0];
    d_20 = C[2 + ldc * 0];
    d_30 = C[3 + ldc * 0];
    d_01 = C[0 + ldc * 1];
    d_11 = C[1 + ldc * 1];
    d_21 = C[2 + ldc * 1];
    d_31 = C[3 + ldc * 1];
    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;
    }
    goto store;
  }
store:
  D[0 + ldd * 0] = c_00;
  D[1 + ldd * 0] = c_10;
  D[2 + ldd * 0] = c_20;
  D[3 + ldd * 0] = c_30;
  D[0 + ldd * 1] = c_01;
  D[1 + ldd * 1] = c_11;
  D[2 + ldd * 1] = c_21;
  D[3 + ldd * 1] = c_31;
  return;
}


x86 assembly (clang, -O0):
<kernel_dgemm_nt_4x2_unpack_lib>:
push   %rbp
mov    %rsp,%rbp
sub    $0x68,%rsp
mov    0x38(%rbp),%eax
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%eax
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    %r9,-0x30(%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
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1826 <kernel_dgemm_nt_4x2_unpack_lib+0x726>
mov    -0x10(%rbp),%rax
imul   $0x0,-0x14(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
imul   $0x0,-0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
imul   $0x0,-0x14(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
imul   $0x0,-0x14(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
imul   $0x0,-0x24(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
imul   $0x0,-0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0xa8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x0,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x0,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x0,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x0,%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x0,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x0,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0xa8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x1,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0xa8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x10(%rbp),%rax
imul   $0x3,-0x14(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
imul   $0x3,-0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
imul   $0x3,-0x14(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
imul   $0x3,-0x14(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
imul   $0x3,-0x24(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
imul   $0x3,-0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0xa8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%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    -0x34(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x34(%rbp)
jmp    1187 <kernel_dgemm_nt_4x2_unpack_lib+0x87>
jmp    182b <kernel_dgemm_nt_4x2_unpack_lib+0x72b>
mov    -0x34(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1a03 <kernel_dgemm_nt_4x2_unpack_lib+0x903>
mov    -0x10(%rbp),%rax
imul   $0x0,-0x14(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
imul   $0x0,-0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
imul   $0x0,-0x14(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
imul   $0x0,-0x14(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
imul   $0x0,-0x24(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
imul   $0x0,-0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0xa8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x14(%rbp),%ecx
shl    $0x0,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x24(%rbp),%ecx
shl    $0x0,%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    182b <kernel_dgemm_nt_4x2_unpack_lib+0x72b>
cmpl   $0x0,0x28(%rbp)
jne    1a12 <kernel_dgemm_nt_4x2_unpack_lib+0x912>
jmp    1c62 <kernel_dgemm_nt_4x2_unpack_lib+0xb62>
mov    -0x30(%rbp),%rax
imul   $0x0,0x10(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x30(%rbp),%rax
imul   $0x0,0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x30(%rbp),%rax
imul   $0x0,0x10(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    -0x30(%rbp),%rax
imul   $0x0,0x10(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
mov    -0x30(%rbp),%rax
mov    0x10(%rbp),%ecx
shl    $0x0,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x30(%rbp),%rax
mov    0x10(%rbp),%ecx
shl    $0x0,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    -0x30(%rbp),%rax
mov    0x10(%rbp),%ecx
shl    $0x0,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    -0x30(%rbp),%rax
mov    0x10(%rbp),%ecx
shl    $0x0,%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
cmpl   $0x1,0x28(%rbp)
jne    1baf <kernel_dgemm_nt_4x2_unpack_lib+0xaaf>
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
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  -0xe8(%rbp),%xmm0
ff
addsd  -0xa8(%rbp),%xmm0
ff
movsd  %xmm0,-0xa8(%rbp)
ff
jmp    1c5d <kernel_dgemm_nt_4x2_unpack_lib+0xb5d>
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
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  -0xe8(%rbp),%xmm0
ff
subsd  -0xa8(%rbp),%xmm0
ff
movsd  %xmm0,-0xa8(%rbp)
ff
jmp    1c62 <kernel_dgemm_nt_4x2_unpack_lib+0xb62>
movsd  -0x70(%rbp),%xmm0
mov    0x18(%rbp),%rax
imul   $0x0,0x20(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x80(%rbp),%xmm0
mov    0x18(%rbp),%rax
imul   $0x0,0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
imul   $0x0,0x20(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0xa0(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
imul   $0x0,0x20(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x78(%rbp),%xmm0
mov    0x18(%rbp),%rax
mov    0x20(%rbp),%ecx
shl    $0x0,%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
mov    0x20(%rbp),%ecx
shl    $0x0,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
mov    0x20(%rbp),%ecx
shl    $0x0,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0xa8(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
mov    0x20(%rbp),%ecx
shl    $0x0,%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
add    $0x68,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dgemm_nt_4x2_unpack_lib>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
cmp    $0x4,%edi
jl     1388 <kernel_dgemm_nt_4x2_unpack_lib+0x288>
mov    %r9,-0x50(%rsp)
mov    %edx,-0x58(%rsp)
movslq %edx,%rax
lea    0x1(%rax),%edx
movslq %edx,%r10
lea    0x2(%rax),%edx
movslq %edx,%rdx
mov    %rdx,-0x8(%rsp)
lea    0x3(%rax),%edx
movslq %edx,%rdx
mov    %rdx,-0x10(%rsp)
mov    %r8d,-0x54(%rsp)
movslq %r8d,%r9
lea    0x1(%r9),%edx
movslq %edx,%rdx
mov    %rdx,-0x18(%rsp)
lea    (%rax,%rax,1),%edx
movslq %edx,%rdx
mov    %rdx,-0x20(%rsp)
lea    0x2(%rax,%rax,1),%edx
movslq %edx,%rdx
mov    %rdx,-0x28(%rsp)
lea    (%r9,%r9,1),%edx
movslq %edx,%rbp
lea    (%rax,%rax,2),%edx
movslq %edx,%rdx
mov    %rdx,-0x30(%rsp)
lea    0x1(%rax,%rax,2),%edx
movslq %edx,%rdx
mov    %rdx,-0x38(%rsp)
lea    0x2(%rax,%rax,2),%edx
movslq %edx,%rdx
mov    %rdx,-0x40(%rsp)
lea    0x3(%rax,%rax,2),%edx
movslq %edx,%rdx
mov    %rdx,-0x48(%rsp)
lea    (%r9,%r9,2),%edx
movslq %edx,%r11
lea    0x1(%r9,%r9,2),%edx
movslq %edx,%r14
lea    0x0(,%rax,4),%edx
movslq %edx,%r15
lea    0x0(,%r9,4),%edx
movslq %edx,%r12
mov    %r10,%rdx
shl    $0x3,%r15
shl    $0x3,%r12
xorpd  %xmm9,%xmm9
xorpd  %xmm0,%xmm0
xorpd  %xmm3,%xmm3
xorpd  %xmm10,%xmm10
lea    -0x3(%rdi),%r13d
xor    %r10d,%r10d
mov    -0x8(%rsp),%r8
nopl   0x0(%rax)
movupd (%rsi),%xmm7
movupd 0x10(%rsi),%xmm5
movsd  (%rcx),%xmm4
movsd  0x8(%rcx),%xmm2
unpcklpd %xmm4,%xmm4
movapd %xmm7,%xmm6
mulpd  %xmm4,%xmm6
addpd  %xmm9,%xmm6
mulpd  %xmm5,%xmm4
addpd  %xmm0,%xmm4
unpcklpd %xmm2,%xmm2
mulpd  %xmm2,%xmm7
addpd  %xmm3,%xmm7
mulpd  %xmm5,%xmm2
movsd  (%rsi,%rax,8),%xmm5
movhpd (%rsi,%rdx,8),%xmm5
addpd  %xmm10,%xmm2
movsd  (%rcx,%r9,8),%xmm3
unpcklpd %xmm3,%xmm3
movapd %xmm5,%xmm8
mulpd  %xmm3,%xmm8
addpd  %xmm6,%xmm8
movsd  (%rsi,%r8,8),%xmm0
mov    -0x10(%rsp),%rbx
movhpd (%rsi,%rbx,8),%xmm0
mulpd  %xmm0,%xmm3
addpd  %xmm4,%xmm3
mov    -0x18(%rsp),%rbx
movsd  (%rcx,%rbx,8),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm1,%xmm0
addpd  %xmm2,%xmm0
mulpd  %xmm5,%xmm1
addpd  %xmm7,%xmm1
mov    -0x20(%rsp),%rbx
movupd (%rsi,%rbx,8),%xmm6
mov    -0x28(%rsp),%rbx
movupd (%rsi,%rbx,8),%xmm2
movsd  (%rcx,%rbp,8),%xmm4
movsd  0x8(%rcx,%rbp,8),%xmm7
unpcklpd %xmm4,%xmm4
movapd %xmm6,%xmm5
mulpd  %xmm4,%xmm5
addpd  %xmm8,%xmm5
mulpd  %xmm2,%xmm4
addpd  %xmm3,%xmm4
unpcklpd %xmm7,%xmm7
mulpd  %xmm7,%xmm6
addpd  %xmm1,%xmm6
mulpd  %xmm2,%xmm7
mov    -0x30(%rsp),%rbx
movsd  (%rsi,%rbx,8),%xmm3
mov    -0x38(%rsp),%rbx
movhpd (%rsi,%rbx,8),%xmm3
addpd  %xmm0,%xmm7
movsd  (%rcx,%r11,8),%xmm11
unpcklpd %xmm11,%xmm11
movapd %xmm3,%xmm8
mulpd  %xmm11,%xmm8
movapd %xmm8,%xmm9
addpd  %xmm5,%xmm9
mov    -0x40(%rsp),%rbx
movsd  (%rsi,%rbx,8),%xmm2
mov    -0x48(%rsp),%rbx
movhpd (%rsi,%rbx,8),%xmm2
mulpd  %xmm2,%xmm11
movapd %xmm11,%xmm0
addpd  %xmm4,%xmm0
movsd  (%rcx,%r14,8),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm1,%xmm2
movapd %xmm2,%xmm10
addpd  %xmm7,%xmm10
mulpd  %xmm3,%xmm1
movapd %xmm1,%xmm3
addpd  %xmm6,%xmm3
add    $0x4,%r10d
add    %r15,%rsi
add    %r12,%rcx
cmp    %r13d,%r10d
jl     11f0 <kernel_dgemm_nt_4x2_unpack_lib+0xf0>
addpd  %xmm6,%xmm1
addpd  %xmm7,%xmm2
addpd  %xmm4,%xmm11
addpd  %xmm5,%xmm8
mov    %edi,%ebx
and    $0xfffffffc,%ebx
mov    -0x50(%rsp),%r9
mov    -0x54(%rsp),%r8d
mov    -0x58(%rsp),%edx
jmp    139c <kernel_dgemm_nt_4x2_unpack_lib+0x29c>
xorpd  %xmm8,%xmm8
xor    %ebx,%ebx
xorpd  %xmm11,%xmm11
xorpd  %xmm1,%xmm1
xorpd  %xmm2,%xmm2
mov    0x50(%rsp),%eax
cmp    %edi,%ebx
jge    1453 <kernel_dgemm_nt_4x2_unpack_lib+0x353>
movslq %edx,%rdx
movslq %r8d,%rbp
add    $0x10,%rsi
shl    $0x3,%rdx
add    $0x8,%rcx
shl    $0x3,%rbp
sub    %ebx,%edi
movapd %xmm2,%xmm5
movapd %xmm1,%xmm3
movapd %xmm11,%xmm10
movapd %xmm8,%xmm9
movupd -0x10(%rsi),%xmm1
movupd (%rsi),%xmm6
movsd  -0x8(%rcx),%xmm7
movsd  (%rcx),%xmm0
unpcklpd %xmm7,%xmm7
movapd %xmm1,%xmm4
mulpd  %xmm7,%xmm4
movapd %xmm4,%xmm8
addpd  %xmm9,%xmm8
mulpd  %xmm6,%xmm7
movapd %xmm7,%xmm11
addpd  %xmm10,%xmm11
unpcklpd %xmm0,%xmm0
mulpd  %xmm0,%xmm6
movapd %xmm6,%xmm2
addpd  %xmm5,%xmm2
mulpd  %xmm1,%xmm0
movapd %xmm0,%xmm1
addpd  %xmm3,%xmm1
add    %rdx,%rsi
add    %rbp,%rcx
add    $0xffffffff,%edi
jne    13c0 <kernel_dgemm_nt_4x2_unpack_lib+0x2c0>
addpd  %xmm3,%xmm0
addpd  %xmm5,%xmm6
addpd  %xmm10,%xmm7
addpd  %xmm9,%xmm4
movapd %xmm4,%xmm8
movapd %xmm7,%xmm11
movapd %xmm0,%xmm1
movapd %xmm6,%xmm2
mov    0x48(%rsp),%edx
mov    0x40(%rsp),%rcx
test   %eax,%eax
je     14d8 <kernel_dgemm_nt_4x2_unpack_lib+0x3d8>
movupd (%r9),%xmm5
movupd 0x10(%r9),%xmm4
movslq 0x38(%rsp),%rsi
movsd  (%r9,%rsi,8),%xmm0
movsd  0x8(%r9,%rsi,8),%xmm7
movsd  0x10(%r9,%rsi,8),%xmm3
movsd  0x18(%r9,%rsi,8),%xmm6
cmp    $0x1,%eax
jne    14ac <kernel_dgemm_nt_4x2_unpack_lib+0x3ac>
addpd  %xmm5,%xmm8
addpd  %xmm4,%xmm11
unpcklpd %xmm7,%xmm0
unpcklpd %xmm6,%xmm3
addpd  %xmm3,%xmm2
addpd  %xmm0,%xmm1
jmp    14d8 <kernel_dgemm_nt_4x2_unpack_lib+0x3d8>
subpd  %xmm8,%xmm5
subpd  %xmm11,%xmm4
unpcklpd %xmm7,%xmm0
unpcklpd %xmm6,%xmm3
subpd  %xmm2,%xmm3
subpd  %xmm1,%xmm0
movapd %xmm5,%xmm8
movapd %xmm4,%xmm11
movapd %xmm0,%xmm1
movapd %xmm3,%xmm2
movupd %xmm8,(%rcx)
movupd %xmm11,0x10(%rcx)
movslq %edx,%rax
movupd %xmm1,(%rcx,%rax,8)
movupd %xmm2,0x10(%rcx,%rax,8)
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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