void kernel_dgema_4_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];
      C[0 + bs * 3] = A[0 + bs * 3];
      C[1 + bs * 3] = A[1 + bs * 3];
      C[2 + bs * 3] = A[2 + bs * 3];
      C[3 + bs * 3] = A[3 + bs * 3];
      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];
      C[0 + bs * 3] = A[0 + bs * 3];
      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[3 + bs * 3] = A[0 + bs * 3];
      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];
      C[0 + bs * 3] = A[1 + bs * 3];
      C[1 + bs * 3] = A[2 + bs * 3];
      C[2 + bs * 3] = A[3 + bs * 3];
      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];
    C[3 + bs * 3] = A[0 + bs * 3];
    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];
    C[0 + bs * 3] = A[1 + bs * 3];
    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];
    C[1 + bs * 3] = A[2 + bs * 3];
    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[2 + bs * 3] = A[0 + bs * 3];
      C[3 + bs * 3] = A[1 + bs * 3];
      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];
      C[0 + bs * 3] = A[2 + bs * 3];
      C[1 + bs * 3] = A[3 + bs * 3];
      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];
    C[2 + bs * 3] = A[0 + bs * 3];
    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];
    C[3 + bs * 3] = A[1 + bs * 3];
    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];
    C[0 + bs * 3] = A[3 + bs * 3];
    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[1 + bs * 3] = A[0 + bs * 3];
      C[2 + bs * 3] = A[1 + bs * 3];
      C[3 + bs * 3] = A[2 + bs * 3];
      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];
      C[0 + bs * 3] = A[3 + bs * 3];
      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];
    C[1 + bs * 3] = A[0 + bs * 3];
    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];
    C[2 + bs * 3] = A[1 + bs * 3];
    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];
    C[3 + bs * 3] = A[2 + bs * 3];
    return;
  }
}


x86 assembly (clang, -O0):
<kernel_dgema_4_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    1320 <kernel_dgema_4_lib4+0x220>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    129e <kernel_dgema_4_lib4+0x19e>
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    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x60(%rax)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x68(%rax)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x70(%rax)
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x78(%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_4_lib4+0x31>
jmp    12a3 <kernel_dgema_4_lib4+0x1a3>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    131b <kernel_dgema_4_lib4+0x21b>
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
movsd  0x60(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x60(%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    12a3 <kernel_dgema_4_lib4+0x1a3>
jmp    1b1c <kernel_dgema_4_lib4+0xa1c>
cmpl   $0x1,-0x8(%rbp)
jne    15d6 <kernel_dgema_4_lib4+0x4d6>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    149e <kernel_dgema_4_lib4+0x39e>
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    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x78(%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    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x60(%rax)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x68(%rax)
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x70(%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    1331 <kernel_dgema_4_lib4+0x231>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jl     14af <kernel_dgema_4_lib4+0x3af>
jmp    1b1c <kernel_dgema_4_lib4+0xa1c>
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    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x78(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    1510 <kernel_dgema_4_lib4+0x410>
jmp    1b1c <kernel_dgema_4_lib4+0xa1c>
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    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x60(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    1589 <kernel_dgema_4_lib4+0x489>
jmp    1b1c <kernel_dgema_4_lib4+0xa1c>
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)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x68(%rax)
jmp    1b1c <kernel_dgema_4_lib4+0xa1c>
cmpl   $0x2,-0x8(%rbp)
jne    188c <kernel_dgema_4_lib4+0x78c>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1754 <kernel_dgema_4_lib4+0x654>
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    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x70(%rax)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x78(%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    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x60(%rax)
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x68(%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    15e7 <kernel_dgema_4_lib4+0x4e7>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jl     1765 <kernel_dgema_4_lib4+0x665>
jmp    1b1c <kernel_dgema_4_lib4+0xa1c>
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    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x70(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    17c6 <kernel_dgema_4_lib4+0x6c6>
jmp    1b1c <kernel_dgema_4_lib4+0xa1c>
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    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x78(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    1828 <kernel_dgema_4_lib4+0x728>
jmp    1b1c <kernel_dgema_4_lib4+0xa1c>
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    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x60(%rax)
jmp    1b1c <kernel_dgema_4_lib4+0xa1c>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1a00 <kernel_dgema_4_lib4+0x900>
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    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x68(%rax)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x70(%rax)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x78(%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    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x60(%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    1893 <kernel_dgema_4_lib4+0x793>
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jl     1a11 <kernel_dgema_4_lib4+0x911>
jmp    1b1c <kernel_dgema_4_lib4+0xa1c>
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    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x68(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    1a72 <kernel_dgema_4_lib4+0x972>
jmp    1b1c <kernel_dgema_4_lib4+0xa1c>
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    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x70(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    1ad4 <kernel_dgema_4_lib4+0x9d4>
jmp    1b1c <kernel_dgema_4_lib4+0xa1c>
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)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x78(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dgema_4_lib4>:
test   %esi,%esi
je     12cb <kernel_dgema_4_lib4+0x1cb>
xor    %eax,%eax
cmp    $0x1,%esi
je     1495 <kernel_dgema_4_lib4+0x395>
cmp    $0x2,%esi
jne    1643 <kernel_dgema_4_lib4+0x543>
cmp    $0x4,%edi
jl     121d <kernel_dgema_4_lib4+0x11d>
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  0x60(%rdx),%xmm0
movsd  %xmm0,0x70(%r8)
movsd  0x68(%rdx),%xmm0
movsd  %xmm0,0x78(%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)
movsd  0x70(%rdx),%xmm0
movsd  %xmm0,0x60(%r8,%rsi,1)
movsd  0x78(%rdx),%xmm0
movsd  %xmm0,0x68(%r8,%rsi,1)
add    %rsi,%r8
add    $0x4,%eax
add    %rcx,%rdx
cmp    %r10d,%eax
jl     1150 <kernel_dgema_4_lib4+0x50>
mov    %edi,%eax
and    $0xfffffffc,%eax
cmp    %edi,%eax
jge    18ee <kernel_dgema_4_lib4+0x7ee>
movsd  (%rdx),%xmm0
movsd  %xmm0,0x10(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x30(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x50(%r8)
movsd  0x60(%rdx),%xmm0
movsd  %xmm0,0x70(%r8)
mov    %eax,%ecx
or     $0x1,%ecx
cmp    %edi,%ecx
je     18ee <kernel_dgema_4_lib4+0x7ee>
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,0x18(%r8)
movsd  0x28(%rdx),%xmm0
movsd  %xmm0,0x38(%r8)
movsd  0x48(%rdx),%xmm0
movsd  %xmm0,0x58(%r8)
movsd  0x68(%rdx),%xmm0
movsd  %xmm0,0x78(%r8)
or     $0x2,%eax
cmp    %edi,%eax
je     18ee <kernel_dgema_4_lib4+0x7ee>
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)
movsd  0x78(%rdx),%xmm0
movsd  %xmm0,0x60(%r8,%rax,8)
ret
xor    %r11d,%r11d
cmp    $0x4,%edi
jl     13c7 <kernel_dgema_4_lib4+0x2c7>
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)
movsd  0x60(%rdx),%xmm0
movsd  %xmm0,0x60(%r8)
movsd  0x68(%rdx),%xmm0
movsd  %xmm0,0x68(%r8)
movsd  0x70(%rdx),%xmm0
movsd  %xmm0,0x70(%r8)
movsd  0x78(%rdx),%xmm0
movsd  %xmm0,0x78(%r8)
add    $0x4,%eax
add    %rcx,%rdx
add    %rsi,%r8
cmp    %r10d,%eax
jl     1300 <kernel_dgema_4_lib4+0x200>
mov    %edi,%r11d
and    $0xfffffffc,%r11d
cmp    %edi,%r11d
jge    18ee <kernel_dgema_4_lib4+0x7ee>
mov    %r11d,%ecx
not    %ecx
add    %edi,%ecx
je     1823 <kernel_dgema_4_lib4+0x723>
lea    (%rdx,%rcx,8),%rax
add    $0x68,%rax
cmp    %rax,%r8
jae    13fb <kernel_dgema_4_lib4+0x2fb>
lea    (%r8,%rcx,8),%rax
add    $0x68,%rax
cmp    %rax,%rdx
jb     1823 <kernel_dgema_4_lib4+0x723>
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     17dd <kernel_dgema_4_lib4+0x6dd>
mov    %r10,%rax
and    $0xfffffffffffffffe,%rax
xor    %esi,%esi
cs 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 0x60(%rdx,%rsi,8),%xmm0
movups %xmm0,0x60(%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)
movups 0x70(%rdx,%rsi,8),%xmm0
movups %xmm0,0x70(%r8,%rsi,8)
add    $0x4,%rsi
add    $0xfffffffffffffffe,%rax
jne    1430 <kernel_dgema_4_lib4+0x330>
jmp    17df <kernel_dgema_4_lib4+0x6df>
cmp    $0x4,%edi
jl     1591 <kernel_dgema_4_lib4+0x491>
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
nopl   (%rax)
movsd  (%rdx),%xmm0
movsd  %xmm0,0x18(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x38(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x58(%r8)
movsd  0x60(%rdx),%xmm0
movsd  %xmm0,0x78(%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)
movsd  0x68(%rdx),%xmm0
movsd  %xmm0,0x60(%r8,%rsi,1)
movsd  0x70(%rdx),%xmm0
movsd  %xmm0,0x68(%r8,%rsi,1)
movsd  0x78(%rdx),%xmm0
movsd  %xmm0,0x70(%r8,%rsi,1)
add    %rsi,%r8
add    $0x4,%eax
add    %rcx,%rdx
cmp    %r10d,%eax
jl     14c0 <kernel_dgema_4_lib4+0x3c0>
mov    %edi,%eax
and    $0xfffffffc,%eax
cmp    %edi,%eax
jge    18ee <kernel_dgema_4_lib4+0x7ee>
movsd  (%rdx),%xmm0
movsd  %xmm0,0x18(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x38(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x58(%r8)
movsd  0x60(%rdx),%xmm0
movsd  %xmm0,0x78(%r8)
mov    %eax,%ecx
or     $0x1,%ecx
cmp    %edi,%ecx
je     18ee <kernel_dgema_4_lib4+0x7ee>
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)
movsd  0x68(%rdx),%xmm0
movsd  %xmm0,0x60(%r8,%rcx,8)
or     $0x2,%eax
cmp    %edi,%eax
je     18ee <kernel_dgema_4_lib4+0x7ee>
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)
movsd  0x70(%rdx),%xmm0
movsd  %xmm0,0x68(%r8,%rcx,8)
ret
cmp    $0x4,%edi
jl     1739 <kernel_dgema_4_lib4+0x639>
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
nopw   0x0(%rax,%rax,1)
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  0x60(%rdx),%xmm0
movsd  %xmm0,0x68(%r8)
movsd  0x68(%rdx),%xmm0
movsd  %xmm0,0x70(%r8)
movsd  0x70(%rdx),%xmm0
movsd  %xmm0,0x78(%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)
movsd  0x78(%rdx),%xmm0
movsd  %xmm0,0x60(%r8,%rsi,1)
add    %rsi,%r8
add    $0x4,%eax
add    %rcx,%rdx
cmp    %r10d,%eax
jl     1670 <kernel_dgema_4_lib4+0x570>
mov    %edi,%eax
and    $0xfffffffc,%eax
cmp    %edi,%eax
jge    18ee <kernel_dgema_4_lib4+0x7ee>
movsd  (%rdx),%xmm0
movsd  %xmm0,0x8(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x28(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x48(%r8)
movsd  0x60(%rdx),%xmm0
movsd  %xmm0,0x68(%r8)
mov    %eax,%ecx
or     $0x1,%ecx
cmp    %edi,%ecx
je     18ee <kernel_dgema_4_lib4+0x7ee>
movsd  0x8(%rdx),%xmm0
movsd  %xmm0,0x10(%r8)
movsd  0x28(%rdx),%xmm0
movsd  %xmm0,0x30(%r8)
movsd  0x48(%rdx),%xmm0
movsd  %xmm0,0x50(%r8)
movsd  0x68(%rdx),%xmm0
movsd  %xmm0,0x70(%r8)
or     $0x2,%eax
cmp    %edi,%eax
je     18ee <kernel_dgema_4_lib4+0x7ee>
movsd  0x10(%rdx),%xmm0
movsd  %xmm0,0x18(%r8)
movsd  0x30(%rdx),%xmm0
movsd  %xmm0,0x38(%r8)
movsd  0x50(%rdx),%xmm0
movsd  %xmm0,0x58(%r8)
movsd  0x70(%rdx),%xmm0
movsd  %xmm0,0x78(%r8)
ret
xor    %esi,%esi
test   $0x1,%r10b
je     180f <kernel_dgema_4_lib4+0x70f>
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 0x60(%rdx,%rsi,8),%xmm0
movups %xmm0,0x60(%r8,%rsi,8)
cmp    %r9,%rcx
je     18ee <kernel_dgema_4_lib4+0x7ee>
add    %r9d,%r11d
lea    (%rdx,%r9,8),%rdx
lea    (%r8,%r9,8),%r8
mov    %edi,%ecx
sub    %r11d,%ecx
mov    %r11d,%eax
not    %eax
test   $0x1,%cl
je     1868 <kernel_dgema_4_lib4+0x768>
movsd  (%rdx),%xmm0
movsd  %xmm0,(%r8)
movsd  0x20(%rdx),%xmm0
movsd  %xmm0,0x20(%r8)
movsd  0x40(%rdx),%xmm0
movsd  %xmm0,0x40(%r8)
movsd  0x60(%rdx),%xmm0
movsd  %xmm0,0x60(%r8)
add    $0x8,%rdx
add    $0x8,%r8
add    $0x1,%r11d
add    %edi,%eax
je     18ee <kernel_dgema_4_lib4+0x7ee>
sub    %r11d,%edi
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nop
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  0x60(%rdx,%rax,8),%xmm0
movsd  %xmm0,0x60(%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)
movsd  0x68(%rdx,%rax,8),%xmm0
movsd  %xmm0,0x68(%r8,%rax,8)
add    $0x2,%rax
cmp    %eax,%edi
jne    1880 <kernel_dgema_4_lib4+0x780>
ret

LLVM IR (-O0):
define void @kernel_dgema_4_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 %151
17: ; preds = %6
store i32 0, i32* %14
br label %18
18: ; preds = %114, %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 %117
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 double*, double** %9
%85 = getelementptr inbounds double, double* %84, i64 12
%86 = load double, double* %85
%87 = load double*, double** %11
%88 = getelementptr inbounds double, double* %87, i64 12
store double %86, double* %88
%89 = load double*, double** %9
%90 = getelementptr inbounds double, double* %89, i64 13
%91 = load double, double* %90
%92 = load double*, double** %11
%93 = getelementptr inbounds double, double* %92, i64 13
store double %91, double* %93
%94 = load double*, double** %9
%95 = getelementptr inbounds double, double* %94, i64 14
%96 = load double, double* %95
%97 = load double*, double** %11
%98 = getelementptr inbounds double, double* %97, i64 14
store double %96, double* %98
%99 = load double*, double** %9
%100 = getelementptr inbounds double, double* %99, i64 15
%101 = load double, double* %100
%102 = load double*, double** %11
%103 = getelementptr inbounds double, double* %102, i64 15
store double %101, double* %103
%104 = load i32, i32* %10
%105 = mul nsw i32 4, %104
%106 = load double*, double** %9
%107 = sext i32 %105 to i64
%108 = getelementptr inbounds double, double* %106, i64 %107
store double* %108, double** %9
%109 = load i32, i32* %12
%110 = mul nsw i32 4, %109
%111 = load double*, double** %11
%112 = sext i32 %110 to i64
%113 = getelementptr inbounds double, double* %111, i64 %112
store double* %113, double** %11
br label %114
114: ; preds = %23
%115 = load i32, i32* %14
%116 = add nsw i32 %115, 4
store i32 %116, i32* %14
br label %18
117: ; preds = %18
br label %118
118: ; preds = %147, %117
%119 = load i32, i32* %14
%120 = load i32, i32* %7
%121 = icmp slt i32 %119, %120
br i1 %121, label %122, label %150
122: ; preds = %118
%123 = load double*, double** %9
%124 = getelementptr inbounds double, double* %123, i64 0
%125 = load double, double* %124
%126 = load double*, double** %11
%127 = getelementptr inbounds double, double* %126, i64 0
store double %125, double* %127
%128 = load double*, double** %9
%129 = getelementptr inbounds double, double* %128, i64 4
%130 = load double, double* %129
%131 = load double*, double** %11
%132 = getelementptr inbounds double, double* %131, i64 4
store double %130, double* %132
%133 = load double*, double** %9
%134 = getelementptr inbounds double, double* %133, i64 8
%135 = load double, double* %134
%136 = load double*, double** %11
%137 = getelementptr inbounds double, double* %136, i64 8
store double %135, double* %137
%138 = load double*, double** %9
%139 = getelementptr inbounds double, double* %138, i64 12
%140 = load double, double* %139
%141 = load double*, double** %11
%142 = getelementptr inbounds double, double* %141, i64 12
store double %140, double* %142
%143 = load double*, double** %9
%144 = getelementptr inbounds double, double* %143, i64 1
store double* %144, double** %9
%145 = load double*, double** %11
%146 = getelementptr inbounds double, double* %145, i64 1
store double* %146, double** %11
br label %147
147: ; preds = %122
%148 = load i32, i32* %14
%149 = add nsw i32 %148, 1
store i32 %149, i32* %14
br label %118
150: ; preds = %118
br label %707
151: ; preds = %6
%152 = load i32, i32* %8
%153 = icmp eq i32 %152, 1
br i1 %153, label %154, label %339
154: ; preds = %151
store i32 0, i32* %14
br label %155
155: ; preds = %251, %154
%156 = load i32, i32* %14
%157 = load i32, i32* %7
%158 = sub nsw i32 %157, 3
%159 = icmp slt i32 %156, %158
br i1 %159, label %160, label %254
160: ; preds = %155
%161 = load double*, double** %9
%162 = getelementptr inbounds double, double* %161, i64 0
%163 = load double, double* %162
%164 = load double*, double** %11
%165 = getelementptr inbounds double, double* %164, i64 3
store double %163, double* %165
%166 = load double*, double** %9
%167 = getelementptr inbounds double, double* %166, i64 4
%168 = load double, double* %167
%169 = load double*, double** %11
%170 = getelementptr inbounds double, double* %169, i64 7
store double %168, double* %170
%171 = load double*, double** %9
%172 = getelementptr inbounds double, double* %171, i64 8
%173 = load double, double* %172
%174 = load double*, double** %11
%175 = getelementptr inbounds double, double* %174, i64 11
store double %173, double* %175
%176 = load double*, double** %9
%177 = getelementptr inbounds double, double* %176, i64 12
%178 = load double, double* %177
%179 = load double*, double** %11
%180 = getelementptr inbounds double, double* %179, i64 15
store double %178, double* %180
%181 = load i32, i32* %12
%182 = mul nsw i32 4, %181
%183 = load double*, double** %11
%184 = sext i32 %182 to i64
%185 = getelementptr inbounds double, double* %183, i64 %184
store double* %185, double** %11
%186 = load double*, double** %9
%187 = getelementptr inbounds double, double* %186, i64 1
%188 = load double, double* %187
%189 = load double*, double** %11
%190 = getelementptr inbounds double, double* %189, i64 0
store double %188, double* %190
%191 = load double*, double** %9
%192 = getelementptr inbounds double, double* %191, i64 2
%193 = load double, double* %192
%194 = load double*, double** %11
%195 = getelementptr inbounds double, double* %194, i64 1
store double %193, double* %195
%196 = load double*, double** %9
%197 = getelementptr inbounds double, double* %196, i64 3
%198 = load double, double* %197
%199 = load double*, double** %11
%200 = getelementptr inbounds double, double* %199, i64 2
store double %198, double* %200
%201 = load double*, double** %9
%202 = getelementptr inbounds double, double* %201, i64 5
%203 = load double, double* %202
%204 = load double*, double** %11
%205 = getelementptr inbounds double, double* %204, i64 4
store double %203, double* %205
%206 = load double*, double** %9
%207 = getelementptr inbounds double, double* %206, i64 6
%208 = load double, double* %207
%209 = load double*, double** %11
%210 = getelementptr inbounds double, double* %209, i64 5
store double %208, double* %210
%211 = load double*, double** %9
%212 = getelementptr inbounds double, double* %211, i64 7
%213 = load double, double* %212
%214 = load double*, double** %11
%215 = getelementptr inbounds double, double* %214, i64 6
store double %213, double* %215
%216 = load double*, double** %9
%217 = getelementptr inbounds double, double* %216, i64 9
%218 = load double, double* %217
%219 = load double*, double** %11
%220 = getelementptr inbounds double, double* %219, i64 8
store double %218, double* %220
%221 = load double*, double** %9
%222 = getelementptr inbounds double, double* %221, i64 10
%223 = load double, double* %222
%224 = load double*, double** %11
%225 = getelementptr inbounds double, double* %224, i64 9
store double %223, double* %225
%226 = load double*, double** %9
%227 = getelementptr inbounds double, double* %226, i64 11
%228 = load double, double* %227
%229 = load double*, double** %11
%230 = getelementptr inbounds double, double* %229, i64 10
store double %228, double* %230
%231 = load double*, double** %9
%232 = getelementptr inbounds double, double* %231, i64 13
%233 = load double, double* %232
%234 = load double*, double** %11
%235 = getelementptr inbounds double, double* %234, i64 12
store double %233, double* %235
%236 = load double*, double** %9
%237 = getelementptr inbounds double, double* %236, i64 14
%238 = load double, double* %237
%239 = load double*, double** %11
%240 = getelementptr inbounds double, double* %239, i64 13
store double %238, double* %240
%241 = load double*, double** %9
%242 = getelementptr inbounds double, double* %241, i64 15
%243 = load double, double* %242
%244 = load double*, double** %11
%245 = getelementptr inbounds double, double* %244, i64 14
store double %243, double* %245
%246 = load i32, i32* %10
%247 = mul nsw i32 4, %246
%248 = load double*, double** %9
%249 = sext i32 %247 to i64
%250 = getelementptr inbounds double, double* %248, i64 %249
store double* %250, double** %9
br label %251
251: ; preds = %160
%252 = load i32, i32* %14
%253 = add nsw i32 %252, 4
store i32 %253, i32* %14
br label %155
254: ; preds = %155
%255 = load i32, i32* %14
%256 = load i32, i32* %7
%257 = icmp sge i32 %255, %256
br i1 %257, label %258, label %259
258: ; preds = %254
br label %707
259: ; preds = %254
%260 = load double*, double** %9
%261 = getelementptr inbounds double, double* %260, i64 0
%262 = load double, double* %261
%263 = load double*, double** %11
%264 = getelementptr inbounds double, double* %263, i64 3
store double %262, double* %264
%265 = load double*, double** %9
%266 = getelementptr inbounds double, double* %265, i64 4
%267 = load double, double* %266
%268 = load double*, double** %11
%269 = getelementptr inbounds double, double* %268, i64 7
store double %267, double* %269
%270 = load double*, double** %9
%271 = getelementptr inbounds double, double* %270, i64 8
%272 = load double, double* %271
%273 = load double*, double** %11
%274 = getelementptr inbounds double, double* %273, i64 11
store double %272, double* %274
%275 = load double*, double** %9
%276 = getelementptr inbounds double, double* %275, i64 12
%277 = load double, double* %276
%278 = load double*, double** %11
%279 = getelementptr inbounds double, double* %278, i64 15
store double %277, double* %279
%280 = load i32, i32* %14
%281 = add nsw i32 %280, 1
store i32 %281, i32* %14
%282 = load i32, i32* %14
%283 = load i32, i32* %7
%284 = icmp eq i32 %282, %283
br i1 %284, label %285, label %286
285: ; preds = %259
br label %707
286: ; preds = %259
%287 = load i32, i32* %12
%288 = mul nsw i32 4, %287
%289 = load double*, double** %11
%290 = sext i32 %288 to i64
%291 = getelementptr inbounds double, double* %289, i64 %290
store double* %291, double** %11
%292 = load double*, double** %9
%293 = getelementptr inbounds double, double* %292, i64 1
%294 = load double, double* %293
%295 = load double*, double** %11
%296 = getelementptr inbounds double, double* %295, i64 0
store double %294, double* %296
%297 = load double*, double** %9
%298 = getelementptr inbounds double, double* %297, i64 5
%299 = load double, double* %298
%300 = load double*, double** %11
%301 = getelementptr inbounds double, double* %300, i64 4
store double %299, double* %301
%302 = load double*, double** %9
%303 = getelementptr inbounds double, double* %302, i64 9
%304 = load double, double* %303
%305 = load double*, double** %11
%306 = getelementptr inbounds double, double* %305, i64 8
store double %304, double* %306
%307 = load double*, double** %9
%308 = getelementptr inbounds double, double* %307, i64 13
%309 = load double, double* %308
%310 = load double*, double** %11
%311 = getelementptr inbounds double, double* %310, i64 12
store double %309, double* %311
%312 = load i32, i32* %14
%313 = add nsw i32 %312, 1
store i32 %313, i32* %14
%314 = load i32, i32* %14
%315 = load i32, i32* %7
%316 = icmp eq i32 %314, %315
br i1 %316, label %317, label %318
317: ; preds = %286
br label %707
318: ; preds = %286
%319 = load double*, double** %9
%320 = getelementptr inbounds double, double* %319, i64 2
%321 = load double, double* %320
%322 = load double*, double** %11
%323 = getelementptr inbounds double, double* %322, i64 1
store double %321, double* %323
%324 = load double*, double** %9
%325 = getelementptr inbounds double, double* %324, i64 6
%326 = load double, double* %325
%327 = load double*, double** %11
%328 = getelementptr inbounds double, double* %327, i64 5
store double %326, double* %328
%329 = load double*, double** %9
%330 = getelementptr inbounds double, double* %329, i64 10
%331 = load double, double* %330
%332 = load double*, double** %11
%333 = getelementptr inbounds double, double* %332, i64 9
store double %331, double* %333
%334 = load double*, double** %9
%335 = getelementptr inbounds double, double* %334, i64 14
%336 = load double, double* %335
%337 = load double*, double** %11
%338 = getelementptr inbounds double, double* %337, i64 13
store double %336, double* %338
br label %707
339: ; preds = %151
%340 = load i32, i32* %8
%341 = icmp eq i32 %340, 2
br i1 %341, label %342, label %527
342: ; preds = %339
store i32 0, i32* %14
br label %343
343: ; preds = %439, %342
%344 = load i32, i32* %14
%345 = load i32, i32* %7
%346 = sub nsw i32 %345, 3
%347 = icmp slt i32 %344, %346
br i1 %347, label %348, label %442
348: ; preds = %343
%349 = load double*, double** %9
%350 = getelementptr inbounds double, double* %349, i64 0
%351 = load double, double* %350
%352 = load double*, double** %11
%353 = getelementptr inbounds double, double* %352, i64 2
store double %351, double* %353
%354 = load double*, double** %9
%355 = getelementptr inbounds double, double* %354, i64 1
%356 = load double, double* %355
%357 = load double*, double** %11
%358 = getelementptr inbounds double, double* %357, i64 3
store double %356, double* %358
%359 = load double*, double** %9
%360 = getelementptr inbounds double, double* %359, i64 4
%361 = load double, double* %360
%362 = load double*, double** %11
%363 = getelementptr inbounds double, double* %362, i64 6
store double %361, double* %363
%364 = load double*, double** %9
%365 = getelementptr inbounds double, double* %364, i64 5
%366 = load double, double* %365
%367 = load double*, double** %11
%368 = getelementptr inbounds double, double* %367, i64 7
store double %366, double* %368
%369 = load double*, double** %9
%370 = getelementptr inbounds double, double* %369, i64 8
%371 = load double, double* %370
%372 = load double*, double** %11
%373 = getelementptr inbounds double, double* %372, i64 10
store double %371, double* %373
%374 = load double*, double** %9
%375 = getelementptr inbounds double, double* %374, i64 9
%376 = load double, double* %375
%377 = load double*, double** %11
%378 = getelementptr inbounds double, double* %377, i64 11
store double %376, double* %378
%379 = load double*, double** %9
%380 = getelementptr inbounds double, double* %379, i64 12
%381 = load double, double* %380
%382 = load double*, double** %11
%383 = getelementptr inbounds double, double* %382, i64 14
store double %381, double* %383
%384 = load double*, double** %9
%385 = getelementptr inbounds double, double* %384, i64 13
%386 = load double, double* %385
%387 = load double*, double** %11
%388 = getelementptr inbounds double, double* %387, i64 15
store double %386, double* %388
%389 = load i32, i32* %12
%390 = mul nsw i32 4, %389
%391 = load double*, double** %11
%392 = sext i32 %390 to i64
%393 = getelementptr inbounds double, double* %391, i64 %392
store double* %393, double** %11
%394 = load double*, double** %9
%395 = getelementptr inbounds double, double* %394, i64 2
%396 = load double, double* %395
%397 = load double*, double** %11
%398 = getelementptr inbounds double, double* %397, i64 0
store double %396, double* %398
%399 = load double*, double** %9
%400 = getelementptr inbounds double, double* %399, i64 3
%401 = load double, double* %400
%402 = load double*, double** %11
%403 = getelementptr inbounds double, double* %402, i64 1
store double %401, double* %403
%404 = load double*, double** %9
%405 = getelementptr inbounds double, double* %404, i64 6
%406 = load double, double* %405
%407 = load double*, double** %11
%408 = getelementptr inbounds double, double* %407, i64 4
store double %406, double* %408
%409 = load double*, double** %9
%410 = getelementptr inbounds double, double* %409, i64 7
%411 = load double, double* %410
%412 = load double*, double** %11
%413 = getelementptr inbounds double, double* %412, i64 5
store double %411, double* %413
%414 = load double*, double** %9
%415 = getelementptr inbounds double, double* %414, i64 10
%416 = load double, double* %415
%417 = load double*, double** %11
%418 = getelementptr inbounds double, double* %417, i64 8
store double %416, double* %418
%419 = load double*, double** %9
%420 = getelementptr inbounds double, double* %419, i64 11
%421 = load double, double* %420
%422 = load double*, double** %11
%423 = getelementptr inbounds double, double* %422, i64 9
store double %421, double* %423
%424 = load double*, double** %9
%425 = getelementptr inbounds double, double* %424, i64 14
%426 = load double, double* %425
%427 = load double*, double** %11
%428 = getelementptr inbounds double, double* %427, i64 12
store double %426, double* %428
%429 = load double*, double** %9
%430 = getelementptr inbounds double, double* %429, i64 15
%431 = load double, double* %430
%432 = load double*, double** %11
%433 = getelementptr inbounds double, double* %432, i64 13
store double %431, double* %433
%434 = load i32, i32* %10
%435 = mul nsw i32 4, %434
%436 = load double*, double** %9
%437 = sext i32 %435 to i64
%438 = getelementptr inbounds double, double* %436, i64 %437
store double* %438, double** %9
br label %439
439: ; preds = %348
%440 = load i32, i32* %14
%441 = add nsw i32 %440, 4
store i32 %441, i32* %14
br label %343
442: ; preds = %343
%443 = load i32, i32* %14
%444 = load i32, i32* %7
%445 = icmp sge i32 %443, %444
br i1 %445, label %446, label %447
446: ; preds = %442
br label %707
447: ; preds = %442
%448 = load double*, double** %9
%449 = getelementptr inbounds double, double* %448, i64 0
%450 = load double, double* %449
%451 = load double*, double** %11
%452 = getelementptr inbounds double, double* %451, i64 2
store double %450, double* %452
%453 = load double*, double** %9
%454 = getelementptr inbounds double, double* %453, i64 4
%455 = load double, double* %454
%456 = load double*, double** %11
%457 = getelementptr inbounds double, double* %456, i64 6
store double %455, double* %457
%458 = load double*, double** %9
%459 = getelementptr inbounds double, double* %458, i64 8
%460 = load double, double* %459
%461 = load double*, double** %11
%462 = getelementptr inbounds double, double* %461, i64 10
store double %460, double* %462
%463 = load double*, double** %9
%464 = getelementptr inbounds double, double* %463, i64 12
%465 = load double, double* %464
%466 = load double*, double** %11
%467 = getelementptr inbounds double, double* %466, i64 14
store double %465, double* %467
%468 = load i32, i32* %14
%469 = add nsw i32 %468, 1
store i32 %469, i32* %14
%470 = load i32, i32* %14
%471 = load i32, i32* %7
%472 = icmp eq i32 %470, %471
br i1 %472, label %473, label %474
473: ; preds = %447
br label %707
474: ; preds = %447
%475 = load double*, double** %9
%476 = getelementptr inbounds double, double* %475, i64 1
%477 = load double, double* %476
%478 = load double*, double** %11
%479 = getelementptr inbounds double, double* %478, i64 3
store double %477, double* %479
%480 = load double*, double** %9
%481 = getelementptr inbounds double, double* %480, i64 5
%482 = load double, double* %481
%483 = load double*, double** %11
%484 = getelementptr inbounds double, double* %483, i64 7
store double %482, double* %484
%485 = load double*, double** %9
%486 = getelementptr inbounds double, double* %485, i64 9
%487 = load double, double* %486
%488 = load double*, double** %11
%489 = getelementptr inbounds double, double* %488, i64 11
store double %487, double* %489
%490 = load double*, double** %9
%491 = getelementptr inbounds double, double* %490, i64 13
%492 = load double, double* %491
%493 = load double*, double** %11
%494 = getelementptr inbounds double, double* %493, i64 15
store double %492, double* %494
%495 = load i32, i32* %14
%496 = add nsw i32 %495, 1
store i32 %496, i32* %14
%497 = load i32, i32* %14
%498 = load i32, i32* %7
%499 = icmp eq i32 %497, %498
br i1 %499, label %500, label %501
500: ; preds = %474
br label %707
501: ; preds = %474
%502 = load i32, i32* %12
%503 = mul nsw i32 4, %502
%504 = load double*, double** %11
%505 = sext i32 %503 to i64
%506 = getelementptr inbounds double, double* %504, i64 %505
store double* %506, double** %11
%507 = load double*, double** %9
%508 = getelementptr inbounds double, double* %507, i64 3
%509 = load double, double* %508
%510 = load double*, double** %11
%511 = getelementptr inbounds double, double* %510, i64 0
store double %509, double* %511
%512 = load double*, double** %9
%513 = getelementptr inbounds double, double* %512, i64 7
%514 = load double, double* %513
%515 = load double*, double** %11
%516 = getelementptr inbounds double, double* %515, i64 4
store double %514, double* %516
%517 = load double*, double** %9
%518 = getelementptr inbounds double, double* %517, i64 11
%519 = load double, double* %518
%520 = load double*, double** %11
%521 = getelementptr inbounds double, double* %520, i64 8
store double %519, double* %521
%522 = load double*, double** %9
%523 = getelementptr inbounds double, double* %522, i64 15
%524 = load double, double* %523
%525 = load double*, double** %11
%526 = getelementptr inbounds double, double* %525, i64 12
store double %524, double* %526
br label %707
527: ; preds = %339
store i32 0, i32* %14
br label %528
528: ; preds = %624, %527
%529 = load i32, i32* %14
%530 = load i32, i32* %7
%531 = sub nsw i32 %530, 3
%532 = icmp slt i32 %529, %531
br i1 %532, label %533, label %627
533: ; preds = %528
%534 = load double*, double** %9
%535 = getelementptr inbounds double, double* %534, i64 0
%536 = load double, double* %535
%537 = load double*, double** %11
%538 = getelementptr inbounds double, double* %537, i64 1
store double %536, double* %538
%539 = load double*, double** %9
%540 = getelementptr inbounds double, double* %539, i64 1
%541 = load double, double* %540
%542 = load double*, double** %11
%543 = getelementptr inbounds double, double* %542, i64 2
store double %541, double* %543
%544 = load double*, double** %9
%545 = getelementptr inbounds double, double* %544, i64 2
%546 = load double, double* %545
%547 = load double*, double** %11
%548 = getelementptr inbounds double, double* %547, i64 3
store double %546, double* %548
%549 = load double*, double** %9
%550 = getelementptr inbounds double, double* %549, i64 4
%551 = load double, double* %550
%552 = load double*, double** %11
%553 = getelementptr inbounds double, double* %552, i64 5
store double %551, double* %553
%554 = load double*, double** %9
%555 = getelementptr inbounds double, double* %554, i64 5
%556 = load double, double* %555
%557 = load double*, double** %11
%558 = getelementptr inbounds double, double* %557, i64 6
store double %556, double* %558
%559 = load double*, double** %9
%560 = getelementptr inbounds double, double* %559, i64 6
%561 = load double, double* %560
%562 = load double*, double** %11
%563 = getelementptr inbounds double, double* %562, i64 7
store double %561, double* %563
%564 = load double*, double** %9
%565 = getelementptr inbounds double, double* %564, i64 8
%566 = load double, double* %565
%567 = load double*, double** %11
%568 = getelementptr inbounds double, double* %567, i64 9
store double %566, double* %568
%569 = load double*, double** %9
%570 = getelementptr inbounds double, double* %569, i64 9
%571 = load double, double* %570
%572 = load double*, double** %11
%573 = getelementptr inbounds double, double* %572, i64 10
store double %571, double* %573
%574 = load double*, double** %9
%575 = getelementptr inbounds double, double* %574, i64 10
%576 = load double, double* %575
%577 = load double*, double** %11
%578 = getelementptr inbounds double, double* %577, i64 11
store double %576, double* %578
%579 = load double*, double** %9
%580 = getelementptr inbounds double, double* %579, i64 12
%581 = load double, double* %580
%582 = load double*, double** %11
%583 = getelementptr inbounds double, double* %582, i64 13
store double %581, double* %583
%584 = load double*, double** %9
%585 = getelementptr inbounds double, double* %584, i64 13
%586 = load double, double* %585
%587 = load double*, double** %11
%588 = getelementptr inbounds double, double* %587, i64 14
store double %586, double* %588
%589 = load double*, double** %9
%590 = getelementptr inbounds double, double* %589, i64 14
%591 = load double, double* %590
%592 = load double*, double** %11
%593 = getelementptr inbounds double, double* %592, i64 15
store double %591, double* %593
%594 = load i32, i32* %12
%595 = mul nsw i32 4, %594
%596 = load double*, double** %11
%597 = sext i32 %595 to i64
%598 = getelementptr inbounds double, double* %596, i64 %597
store double* %598, double** %11
%599 = load double*, double** %9
%600 = getelementptr inbounds double, double* %599, i64 3
%601 = load double, double* %600
%602 = load double*, double** %11
%603 = getelementptr inbounds double, double* %602, i64 0
store double %601, double* %603
%604 = load double*, double** %9
%605 = getelementptr inbounds double, double* %604, i64 7
%606 = load double, double* %605
%607 = load double*, double** %11
%608 = getelementptr inbounds double, double* %607, i64 4
store double %606, double* %608
%609 = load double*, double** %9
%610 = getelementptr inbounds double, double* %609, i64 11
%611 = load double, double* %610
%612 = load double*, double** %11
%613 = getelementptr inbounds double, double* %612, i64 8
store double %611, double* %613
%614 = load double*, double** %9
%615 = getelementptr inbounds double, double* %614, i64 15
%616 = load double, double* %615
%617 = load double*, double** %11
%618 = getelementptr inbounds double, double* %617, i64 12
store double %616, double* %618
%619 = load i32, i32* %10
%620 = mul nsw i32 4, %619
%621 = load double*, double** %9
%622 = sext i32 %620 to i64
%623 = getelementptr inbounds double, double* %621, i64 %622
store double* %623, double** %9
br label %624
624: ; preds = %533
%625 = load i32, i32* %14
%626 = add nsw i32 %625, 4
store i32 %626, i32* %14
br label %528
627: ; preds = %528
%628 = load i32, i32* %14
%629 = load i32, i32* %7
%630 = icmp sge i32 %628, %629
br i1 %630, label %631, label %632
631: ; preds = %627
br label %707
632: ; preds = %627
%633 = load double*, double** %9
%634 = getelementptr inbounds double, double* %633, i64 0
%635 = load double, double* %634
%636 = load double*, double** %11
%637 = getelementptr inbounds double, double* %636, i64 1
store double %635, double* %637
%638 = load double*, double** %9
%639 = getelementptr inbounds double, double* %638, i64 4
%640 = load double, double* %639
%641 = load double*, double** %11
%642 = getelementptr inbounds double, double* %641, i64 5
store double %640, double* %642
%643 = load double*, double** %9
%644 = getelementptr inbounds double, double* %643, i64 8
%645 = load double, double* %644
%646 = load double*, double** %11
%647 = getelementptr inbounds double, double* %646, i64 9
store double %645, double* %647
%648 = load double*, double** %9
%649 = getelementptr inbounds double, double* %648, i64 12
%650 = load double, double* %649
%651 = load double*, double** %11
%652 = getelementptr inbounds double, double* %651, i64 13
store double %650, double* %652
%653 = load i32, i32* %14
%654 = add nsw i32 %653, 1
store i32 %654, i32* %14
%655 = load i32, i32* %14
%656 = load i32, i32* %7
%657 = icmp eq i32 %655, %656
br i1 %657, label %658, label %659
658: ; preds = %632
br label %707
659: ; preds = %632
%660 = load double*, double** %9
%661 = getelementptr inbounds double, double* %660, i64 1
%662 = load double, double* %661
%663 = load double*, double** %11
%664 = getelementptr inbounds double, double* %663, i64 2
store double %662, double* %664
%665 = load double*, double** %9
%666 = getelementptr inbounds double, double* %665, i64 5
%667 = load double, double* %666
%668 = load double*, double** %11
%669 = getelementptr inbounds double, double* %668, i64 6
store double %667, double* %669
%670 = load double*, double** %9
%671 = getelementptr inbounds double, double* %670, i64 9
%672 = load double, double* %671
%673 = load double*, double** %11
%674 = getelementptr inbounds double, double* %673, i64 10
store double %672, double* %674
%675 = load double*, double** %9
%676 = getelementptr inbounds double, double* %675, i64 13
%677 = load double, double* %676
%678 = load double*, double** %11
%679 = getelementptr inbounds double, double* %678, i64 14
store double %677, double* %679
%680 = load i32, i32* %14
%681 = add nsw i32 %680, 1
store i32 %681, i32* %14
%682 = load i32, i32* %14
%683 = load i32, i32* %7
%684 = icmp eq i32 %682, %683
br i1 %684, label %685, label %686
685: ; preds = %659
br label %707
686: ; preds = %659
%687 = load double*, double** %9
%688 = getelementptr inbounds double, double* %687, i64 2
%689 = load double, double* %688
%690 = load double*, double** %11
%691 = getelementptr inbounds double, double* %690, i64 3
store double %689, double* %691
%692 = load double*, double** %9
%693 = getelementptr inbounds double, double* %692, i64 6
%694 = load double, double* %693
%695 = load double*, double** %11
%696 = getelementptr inbounds double, double* %695, i64 7
store double %694, double* %696
%697 = load double*, double** %9
%698 = getelementptr inbounds double, double* %697, i64 10
%699 = load double, double* %698
%700 = load double*, double** %11
%701 = getelementptr inbounds double, double* %700, i64 11
store double %699, double* %701
%702 = load double*, double** %9
%703 = getelementptr inbounds double, double* %702, i64 14
%704 = load double, double* %703
%705 = load double*, double** %11
%706 = getelementptr inbounds double, double* %705, i64 15
store double %704, double* %706
br label %707
707: ; preds = %686, %685, %658, %631, %501, %500, %473, %446, %318, %317, %285, %258, %150
ret void
}

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