void kernel_dgema_3_lib4(int kmax, int kna, double *A, int sda, double *C,
                         int sdc) {
  const int bs = 4;
  int k;
  if (kna == 0) {
    k = 0;
    for (; k < kmax - 3; k += 4) {
      C[0 + bs * 0] = A[0 + bs * 0];
      C[1 + bs * 0] = A[1 + bs * 0];
      C[2 + bs * 0] = A[2 + bs * 0];
      C[3 + bs * 0] = A[3 + bs * 0];
      C[0 + bs * 1] = A[0 + bs * 1];
      C[1 + bs * 1] = A[1 + bs * 1];
      C[2 + bs * 1] = A[2 + bs * 1];
      C[3 + bs * 1] = A[3 + bs * 1];
      C[0 + bs * 2] = A[0 + bs * 2];
      C[1 + bs * 2] = A[1 + bs * 2];
      C[2 + bs * 2] = A[2 + bs * 2];
      C[3 + bs * 2] = A[3 + bs * 2];
      A += bs * sda;
      C += bs * sdc;
    }
    for (; k < kmax; k++) {
      C[0 + bs * 0] = A[0 + bs * 0];
      C[0 + bs * 1] = A[0 + bs * 1];
      C[0 + bs * 2] = A[0 + bs * 2];
      A += 1;
      C += 1;
    }
    return;
  } else if (kna == 1) {
    k = 0;
    for (; k < kmax - 3; k += 4) {
      C[3 + bs * 0] = A[0 + bs * 0];
      C[3 + bs * 1] = A[0 + bs * 1];
      C[3 + bs * 2] = A[0 + bs * 2];
      C += bs * sdc;
      C[0 + bs * 0] = A[1 + bs * 0];
      C[1 + bs * 0] = A[2 + bs * 0];
      C[2 + bs * 0] = A[3 + bs * 0];
      C[0 + bs * 1] = A[1 + bs * 1];
      C[1 + bs * 1] = A[2 + bs * 1];
      C[2 + bs * 1] = A[3 + bs * 1];
      C[0 + bs * 2] = A[1 + bs * 2];
      C[1 + bs * 2] = A[2 + bs * 2];
      C[2 + bs * 2] = A[3 + bs * 2];
      A += bs * sda;
    }
    if (k >= kmax) {
      return;
    }
    C[3 + bs * 0] = A[0 + bs * 0];
    C[3 + bs * 1] = A[0 + bs * 1];
    C[3 + bs * 2] = A[0 + bs * 2];
    k++;
    if (k == kmax) {
      return;
    }
    C += bs * sdc;
    C[0 + bs * 0] = A[1 + bs * 0];
    C[0 + bs * 1] = A[1 + bs * 1];
    C[0 + bs * 2] = A[1 + bs * 2];
    k++;
    if (k == kmax) {
      return;
    }
    C[1 + bs * 0] = A[2 + bs * 0];
    C[1 + bs * 1] = A[2 + bs * 1];
    C[1 + bs * 2] = A[2 + bs * 2];
    return;
  } else if (kna == 2) {
    k = 0;
    for (; k < kmax - 3; k += 4) {
      C[2 + bs * 0] = A[0 + bs * 0];
      C[3 + bs * 0] = A[1 + bs * 0];
      C[2 + bs * 1] = A[0 + bs * 1];
      C[3 + bs * 1] = A[1 + bs * 1];
      C[2 + bs * 2] = A[0 + bs * 2];
      C[3 + bs * 2] = A[1 + bs * 2];
      C += bs * sdc;
      C[0 + bs * 0] = A[2 + bs * 0];
      C[1 + bs * 0] = A[3 + bs * 0];
      C[0 + bs * 1] = A[2 + bs * 1];
      C[1 + bs * 1] = A[3 + bs * 1];
      C[0 + bs * 2] = A[2 + bs * 2];
      C[1 + bs * 2] = A[3 + bs * 2];
      A += bs * sda;
    }
    if (k >= kmax) {
      return;
    }
    C[2 + bs * 0] = A[0 + bs * 0];
    C[2 + bs * 1] = A[0 + bs * 1];
    C[2 + bs * 2] = A[0 + bs * 2];
    k++;
    if (k == kmax) {
      return;
    }
    C[3 + bs * 0] = A[1 + bs * 0];
    C[3 + bs * 1] = A[1 + bs * 1];
    C[3 + bs * 2] = A[1 + bs * 2];
    k++;
    if (k == kmax) {
      return;
    }
    C += bs * sdc;
    C[0 + bs * 0] = A[3 + bs * 0];
    C[0 + bs * 1] = A[3 + bs * 1];
    C[0 + bs * 2] = A[3 + bs * 2];
    return;
  } else {
    k = 0;
    for (; k < kmax - 3; k += 4) {
      C[1 + bs * 0] = A[0 + bs * 0];
      C[2 + bs * 0] = A[1 + bs * 0];
      C[3 + bs * 0] = A[2 + bs * 0];
      C[1 + bs * 1] = A[0 + bs * 1];
      C[2 + bs * 1] = A[1 + bs * 1];
      C[3 + bs * 1] = A[2 + bs * 1];
      C[1 + bs * 2] = A[0 + bs * 2];
      C[2 + bs * 2] = A[1 + bs * 2];
      C[3 + bs * 2] = A[2 + bs * 2];
      C += bs * sdc;
      C[0 + bs * 0] = A[3 + bs * 0];
      C[0 + bs * 1] = A[3 + bs * 1];
      C[0 + bs * 2] = A[3 + bs * 2];
      A += bs * sda;
    }
    if (k >= kmax) {
      return;
    }
    C[1 + bs * 0] = A[0 + bs * 0];
    C[1 + bs * 1] = A[0 + bs * 1];
    C[1 + bs * 2] = A[0 + bs * 2];
    k++;
    if (k == kmax) {
      return;
    }
    C[2 + bs * 0] = A[1 + bs * 0];
    C[2 + bs * 1] = A[1 + bs * 1];
    C[2 + bs * 2] = A[1 + bs * 2];
    k++;
    if (k == kmax) {
      return;
    }
    C[3 + bs * 0] = A[2 + bs * 0];
    C[3 + bs * 1] = A[2 + bs * 1];
    C[3 + bs * 2] = A[2 + bs * 2];
    return;
  }
}


x86 assembly (clang, -O0):
<kernel_dgema_3_lib4>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
movl   $0x4,-0x28(%rbp)
cmpl   $0x0,-0x8(%rbp)
jne    12c6 <kernel_dgema_3_lib4+0x1c6>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1256 <kernel_dgema_3_lib4+0x156>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x20(%rax)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x28(%rax)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x30(%rax)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x40(%rax)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x48(%rax)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x50(%rax)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x58(%rax)
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    -0x2c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x2c(%rbp)
jmp    1131 <kernel_dgema_3_lib4+0x31>
jmp    125b <kernel_dgema_3_lib4+0x15b>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    12c1 <kernel_dgema_3_lib4+0x1c1>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x20(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x40(%rax)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    125b <kernel_dgema_3_lib4+0x15b>
jmp    1948 <kernel_dgema_3_lib4+0x848>
cmpl   $0x1,-0x8(%rbp)
jne    14fe <kernel_dgema_3_lib4+0x3fe>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    13fc <kernel_dgema_3_lib4+0x2fc>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x58(%rax)
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    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x20(%rax)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x28(%rax)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x30(%rax)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x40(%rax)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x48(%rax)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x50(%rax)
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    -0x2c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x2c(%rbp)
jmp    12d7 <kernel_dgema_3_lib4+0x1d7>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jl     140d <kernel_dgema_3_lib4+0x30d>
jmp    1948 <kernel_dgema_3_lib4+0x848>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x58(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    145c <kernel_dgema_3_lib4+0x35c>
jmp    1948 <kernel_dgema_3_lib4+0x848>
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    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x20(%rax)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x40(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    14c3 <kernel_dgema_3_lib4+0x3c3>
jmp    1948 <kernel_dgema_3_lib4+0x848>
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x28(%rax)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x48(%rax)
jmp    1948 <kernel_dgema_3_lib4+0x848>
cmpl   $0x2,-0x8(%rbp)
jne    1736 <kernel_dgema_3_lib4+0x636>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1634 <kernel_dgema_3_lib4+0x534>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x30(%rax)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x50(%rax)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x58(%rax)
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    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x20(%rax)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x28(%rax)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x40(%rax)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x48(%rax)
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    -0x2c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x2c(%rbp)
jmp    150f <kernel_dgema_3_lib4+0x40f>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jl     1645 <kernel_dgema_3_lib4+0x545>
jmp    1948 <kernel_dgema_3_lib4+0x848>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x30(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x50(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    1694 <kernel_dgema_3_lib4+0x594>
jmp    1948 <kernel_dgema_3_lib4+0x848>
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x58(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    16e4 <kernel_dgema_3_lib4+0x5e4>
jmp    1948 <kernel_dgema_3_lib4+0x848>
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    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x20(%rax)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x40(%rax)
jmp    1948 <kernel_dgema_3_lib4+0x848>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1862 <kernel_dgema_3_lib4+0x762>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x28(%rax)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x30(%rax)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x48(%rax)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x50(%rax)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x58(%rax)
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    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x20(%rax)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x40(%rax)
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    -0x2c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x2c(%rbp)
jmp    173d <kernel_dgema_3_lib4+0x63d>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jl     1873 <kernel_dgema_3_lib4+0x773>
jmp    1948 <kernel_dgema_3_lib4+0x848>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x28(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x48(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    18c2 <kernel_dgema_3_lib4+0x7c2>
jmp    1948 <kernel_dgema_3_lib4+0x848>
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x30(%rax)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x50(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    1912 <kernel_dgema_3_lib4+0x812>
jmp    1948 <kernel_dgema_3_lib4+0x848>
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x58(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dgema_3_lib4>:
test   %esi,%esi
je     127b <kernel_dgema_3_lib4+0x17b>
xor    %eax,%eax
cmp    $0x1,%esi
je     13ff <kernel_dgema_3_lib4+0x2ff>
cmp    $0x2,%esi
jne    1561 <kernel_dgema_3_lib4+0x461>
cmp    $0x4,%edi
jl     11ef <kernel_dgema_3_lib4+0xef>
lea    -0x3(%rdi),%r10d
lea    0x0(,%r9,4),%eax
movslq %eax,%rsi
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
shl    $0x3,%rsi
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rdx),%xmm0
movsd  %xmm0,0x10(%r8)
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,0x18(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x30(%r8)
movsd  0x28(%rdx),%xmm0
movsd  %xmm0,0x38(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x50(%r8)
movsd  0x48(%rdx),%xmm0
movsd  %xmm0,0x58(%r8)
movsd  0x10(%rdx),%xmm0
movsd  %xmm0,(%r8,%rsi,1)
movsd  0x18(%rdx),%xmm0
movsd  %xmm0,0x8(%r8,%rsi,1)
movsd  0x30(%rdx),%xmm0
movsd  %xmm0,0x20(%r8,%rsi,1)
movsd  0x38(%rdx),%xmm0
movsd  %xmm0,0x28(%r8,%rsi,1)
movsd  0x50(%rdx),%xmm0
movsd  %xmm0,0x40(%r8,%rsi,1)
movsd  0x58(%rdx),%xmm0
movsd  %xmm0,0x48(%r8,%rsi,1)
add    %rsi,%r8
add    $0x4,%eax
add    %rcx,%rdx
cmp    %r10d,%eax
jl     1150 <kernel_dgema_3_lib4+0x50>
mov    %edi,%eax
and    $0xfffffffc,%eax
cmp    %edi,%eax
jge    1784 <kernel_dgema_3_lib4+0x684>
movsd  (%rdx),%xmm0
movsd  %xmm0,0x10(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x30(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x50(%r8)
mov    %eax,%ecx
or     $0x1,%ecx
cmp    %edi,%ecx
je     1784 <kernel_dgema_3_lib4+0x684>
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,0x18(%r8)
movsd  0x28(%rdx),%xmm0
movsd  %xmm0,0x38(%r8)
movsd  0x48(%rdx),%xmm0
movsd  %xmm0,0x58(%r8)
or     $0x2,%eax
cmp    %edi,%eax
je     1784 <kernel_dgema_3_lib4+0x684>
shl    $0x2,%r9d
movslq %r9d,%rax
movsd  0x18(%rdx),%xmm0
movsd  %xmm0,(%r8,%rax,8)
movsd  0x38(%rdx),%xmm0
movsd  %xmm0,0x20(%r8,%rax,8)
movsd  0x58(%rdx),%xmm0
movsd  %xmm0,0x40(%r8,%rax,8)
ret
xor    %r11d,%r11d
cmp    $0x4,%edi
jl     134b <kernel_dgema_3_lib4+0x24b>
lea    -0x3(%rdi),%r10d
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x2,%r9d
movslq %r9d,%rsi
shl    $0x3,%rcx
shl    $0x3,%rsi
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  (%rdx),%xmm0
movsd  %xmm0,(%r8)
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,0x8(%r8)
movsd  0x10(%rdx),%xmm0
movsd  %xmm0,0x10(%r8)
movsd  0x18(%rdx),%xmm0
movsd  %xmm0,0x18(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x20(%r8)
movsd  0x28(%rdx),%xmm0
movsd  %xmm0,0x28(%r8)
movsd  0x30(%rdx),%xmm0
movsd  %xmm0,0x30(%r8)
movsd  0x38(%rdx),%xmm0
movsd  %xmm0,0x38(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x40(%r8)
movsd  0x48(%rdx),%xmm0
movsd  %xmm0,0x48(%r8)
movsd  0x50(%rdx),%xmm0
movsd  %xmm0,0x50(%r8)
movsd  0x58(%rdx),%xmm0
movsd  %xmm0,0x58(%r8)
add    $0x4,%eax
add    %rcx,%rdx
add    %rsi,%r8
cmp    %r10d,%eax
jl     12b0 <kernel_dgema_3_lib4+0x1b0>
mov    %edi,%r11d
and    $0xfffffffc,%r11d
cmp    %edi,%r11d
jge    1784 <kernel_dgema_3_lib4+0x684>
mov    %r11d,%ecx
not    %ecx
add    %edi,%ecx
je     16ea <kernel_dgema_3_lib4+0x5ea>
lea    (%rdx,%rcx,8),%rax
add    $0x48,%rax
cmp    %rax,%r8
jae    137f <kernel_dgema_3_lib4+0x27f>
lea    (%r8,%rcx,8),%rax
add    $0x48,%rax
cmp    %rax,%rdx
jb     16ea <kernel_dgema_3_lib4+0x5ea>
add    $0x1,%rcx
mov    %rcx,%r9
and    $0xfffffffffffffffe,%r9
lea    -0x2(%r9),%rax
mov    %rax,%r10
shr    %r10
add    $0x1,%r10
test   %rax,%rax
je     16af <kernel_dgema_3_lib4+0x5af>
mov    %r10,%rax
and    $0xfffffffffffffffe,%rax
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
movups (%rdx,%rsi,8),%xmm0
movups %xmm0,(%r8,%rsi,8)
movups 0x20(%rdx,%rsi,8),%xmm0
movups %xmm0,0x20(%r8,%rsi,8)
movups 0x40(%rdx,%rsi,8),%xmm0
movups %xmm0,0x40(%r8,%rsi,8)
movups 0x10(%rdx,%rsi,8),%xmm0
movups %xmm0,0x10(%r8,%rsi,8)
movups 0x30(%rdx,%rsi,8),%xmm0
movups %xmm0,0x30(%r8,%rsi,8)
movups 0x50(%rdx,%rsi,8),%xmm0
movups %xmm0,0x50(%r8,%rsi,8)
add    $0x4,%rsi
add    $0xfffffffffffffffe,%rax
jne    13b0 <kernel_dgema_3_lib4+0x2b0>
jmp    16b1 <kernel_dgema_3_lib4+0x5b1>
cmp    $0x4,%edi
jl     14d2 <kernel_dgema_3_lib4+0x3d2>
lea    -0x3(%rdi),%r10d
lea    0x0(,%r9,4),%eax
movslq %eax,%rsi
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
shl    $0x3,%rsi
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movsd  (%rdx),%xmm0
movsd  %xmm0,0x18(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x38(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x58(%r8)
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,(%r8,%rsi,1)
movsd  0x10(%rdx),%xmm0
movsd  %xmm0,0x8(%r8,%rsi,1)
movsd  0x18(%rdx),%xmm0
movsd  %xmm0,0x10(%r8,%rsi,1)
movsd  0x28(%rdx),%xmm0
movsd  %xmm0,0x20(%r8,%rsi,1)
movsd  0x30(%rdx),%xmm0
movsd  %xmm0,0x28(%r8,%rsi,1)
movsd  0x38(%rdx),%xmm0
movsd  %xmm0,0x30(%r8,%rsi,1)
movsd  0x48(%rdx),%xmm0
movsd  %xmm0,0x40(%r8,%rsi,1)
movsd  0x50(%rdx),%xmm0
movsd  %xmm0,0x48(%r8,%rsi,1)
movsd  0x58(%rdx),%xmm0
movsd  %xmm0,0x50(%r8,%rsi,1)
add    %rsi,%r8
add    $0x4,%eax
add    %rcx,%rdx
cmp    %r10d,%eax
jl     1430 <kernel_dgema_3_lib4+0x330>
mov    %edi,%eax
and    $0xfffffffc,%eax
cmp    %edi,%eax
jge    1784 <kernel_dgema_3_lib4+0x684>
movsd  (%rdx),%xmm0
movsd  %xmm0,0x18(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x38(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x58(%r8)
mov    %eax,%ecx
or     $0x1,%ecx
cmp    %edi,%ecx
je     1784 <kernel_dgema_3_lib4+0x684>
shl    $0x2,%r9d
movslq %r9d,%rcx
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,(%r8,%rcx,8)
movsd  0x28(%rdx),%xmm0
movsd  %xmm0,0x20(%r8,%rcx,8)
movsd  0x48(%rdx),%xmm0
movsd  %xmm0,0x40(%r8,%rcx,8)
or     $0x2,%eax
cmp    %edi,%eax
je     1784 <kernel_dgema_3_lib4+0x684>
movsd  0x10(%rdx),%xmm0
movsd  %xmm0,0x8(%r8,%rcx,8)
movsd  0x30(%rdx),%xmm0
movsd  %xmm0,0x28(%r8,%rcx,8)
movsd  0x50(%rdx),%xmm0
movsd  %xmm0,0x48(%r8,%rcx,8)
ret
cmp    $0x4,%edi
jl     162c <kernel_dgema_3_lib4+0x52c>
lea    -0x3(%rdi),%r10d
shl    $0x2,%r9d
movslq %r9d,%rsi
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
shl    $0x3,%rsi
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nop
movsd  (%rdx),%xmm0
movsd  %xmm0,0x8(%r8)
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,0x10(%r8)
movsd  0x10(%rdx),%xmm0
movsd  %xmm0,0x18(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x28(%r8)
movsd  0x28(%rdx),%xmm0
movsd  %xmm0,0x30(%r8)
movsd  0x30(%rdx),%xmm0
movsd  %xmm0,0x38(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x48(%r8)
movsd  0x48(%rdx),%xmm0
movsd  %xmm0,0x50(%r8)
movsd  0x50(%rdx),%xmm0
movsd  %xmm0,0x58(%r8)
movsd  0x18(%rdx),%xmm0
movsd  %xmm0,(%r8,%rsi,1)
movsd  0x38(%rdx),%xmm0
movsd  %xmm0,0x20(%r8,%rsi,1)
movsd  0x58(%rdx),%xmm0
movsd  %xmm0,0x40(%r8,%rsi,1)
add    %rsi,%r8
add    $0x4,%eax
add    %rcx,%rdx
cmp    %r10d,%eax
jl     1590 <kernel_dgema_3_lib4+0x490>
mov    %edi,%eax
and    $0xfffffffc,%eax
cmp    %edi,%eax
jge    1784 <kernel_dgema_3_lib4+0x684>
movsd  (%rdx),%xmm0
movsd  %xmm0,0x8(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x28(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x48(%r8)
mov    %eax,%ecx
or     $0x1,%ecx
cmp    %edi,%ecx
je     1784 <kernel_dgema_3_lib4+0x684>
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,0x10(%r8)
movsd  0x28(%rdx),%xmm0
movsd  %xmm0,0x30(%r8)
movsd  0x48(%rdx),%xmm0
movsd  %xmm0,0x50(%r8)
or     $0x2,%eax
cmp    %edi,%eax
je     1784 <kernel_dgema_3_lib4+0x684>
movsd  0x10(%rdx),%xmm0
movsd  %xmm0,0x18(%r8)
movsd  0x30(%rdx),%xmm0
movsd  %xmm0,0x38(%r8)
movsd  0x50(%rdx),%xmm0
movsd  %xmm0,0x58(%r8)
ret
xor    %esi,%esi
test   $0x1,%r10b
je     16d6 <kernel_dgema_3_lib4+0x5d6>
movups (%rdx,%rsi,8),%xmm0
movups %xmm0,(%r8,%rsi,8)
movups 0x20(%rdx,%rsi,8),%xmm0
movups %xmm0,0x20(%r8,%rsi,8)
movups 0x40(%rdx,%rsi,8),%xmm0
movups %xmm0,0x40(%r8,%rsi,8)
cmp    %r9,%rcx
je     1784 <kernel_dgema_3_lib4+0x684>
add    %r9d,%r11d
lea    (%rdx,%r9,8),%rdx
lea    (%r8,%r9,8),%r8
mov    %edi,%eax
sub    %r11d,%eax
mov    %r11d,%ecx
not    %ecx
test   $0x1,%al
je     1723 <kernel_dgema_3_lib4+0x623>
movsd  (%rdx),%xmm0
movsd  %xmm0,(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x20(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x40(%r8)
add    $0x8,%rdx
add    $0x8,%r8
add    $0x1,%r11d
add    %edi,%ecx
je     1784 <kernel_dgema_3_lib4+0x684>
sub    %r11d,%edi
xor    %eax,%eax
nopl   0x0(%rax)
movsd  (%rdx,%rax,8),%xmm0
movsd  %xmm0,(%r8,%rax,8)
movsd  0x20(%rdx,%rax,8),%xmm0
movsd  %xmm0,0x20(%r8,%rax,8)
movsd  0x40(%rdx,%rax,8),%xmm0
movsd  %xmm0,0x40(%r8,%rax,8)
movsd  0x8(%rdx,%rax,8),%xmm0
movsd  %xmm0,0x8(%r8,%rax,8)
movsd  0x28(%rdx,%rax,8),%xmm0
movsd  %xmm0,0x28(%r8,%rax,8)
movsd  0x48(%rdx,%rax,8),%xmm0
movsd  %xmm0,0x48(%r8,%rax,8)
add    $0x2,%rax
cmp    %eax,%edi
jne    1730 <kernel_dgema_3_lib4+0x630>
ret

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

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