void kernel_dgemm_diag_right_4_lib4(int kmax, double *A, int sda, double *B,
                                    double *C, int sdc, double *D, int sdd,
                                    int alg) {
  if (kmax <= 0)
    return;
  const int bs = 4;
  int k;
  double a_0, a_1, a_2, a_3, b_0, b_1, b_2, b_3, c_0, c_1, c_2, c_3;
  if (alg == -1) {
    b_0 = -B[0];
    b_1 = -B[1];
    b_2 = -B[2];
    b_3 = -B[3];
  } else {
    b_0 = B[0];
    b_1 = B[1];
    b_2 = B[2];
    b_3 = B[3];
  }
  if (alg == 0) {
    for (k = 0; k < kmax - 3; k += 4) {
      a_0 = A[0 + bs * 0];
      a_1 = A[1 + bs * 0];
      a_2 = A[2 + bs * 0];
      a_3 = A[3 + bs * 0];
      c_0 = a_0 * b_0;
      c_1 = a_1 * b_0;
      c_2 = a_2 * b_0;
      c_3 = a_3 * b_0;
      D[0 + bs * 0] = c_0;
      D[1 + bs * 0] = c_1;
      D[2 + bs * 0] = c_2;
      D[3 + bs * 0] = c_3;
      a_0 = A[0 + bs * 1];
      a_1 = A[1 + bs * 1];
      a_2 = A[2 + bs * 1];
      a_3 = A[3 + bs * 1];
      c_0 = a_0 * b_1;
      c_1 = a_1 * b_1;
      c_2 = a_2 * b_1;
      c_3 = a_3 * b_1;
      D[0 + bs * 1] = c_0;
      D[1 + bs * 1] = c_1;
      D[2 + bs * 1] = c_2;
      D[3 + bs * 1] = c_3;
      a_0 = A[0 + bs * 2];
      a_1 = A[1 + bs * 2];
      a_2 = A[2 + bs * 2];
      a_3 = A[3 + bs * 2];
      c_0 = a_0 * b_2;
      c_1 = a_1 * b_2;
      c_2 = a_2 * b_2;
      c_3 = a_3 * b_2;
      D[0 + bs * 2] = c_0;
      D[1 + bs * 2] = c_1;
      D[2 + bs * 2] = c_2;
      D[3 + bs * 2] = c_3;
      a_0 = A[0 + bs * 3];
      a_1 = A[1 + bs * 3];
      a_2 = A[2 + bs * 3];
      a_3 = A[3 + bs * 3];
      c_0 = a_0 * b_3;
      c_1 = a_1 * b_3;
      c_2 = a_2 * b_3;
      c_3 = a_3 * b_3;
      D[0 + bs * 3] = c_0;
      D[1 + bs * 3] = c_1;
      D[2 + bs * 3] = c_2;
      D[3 + bs * 3] = c_3;
      A += 4 * sda;
      D += 4 * sdd;
    }
    for (; k < kmax; k++) {
      a_0 = A[0 + bs * 0];
      c_0 = a_0 * b_0;
      D[0 + bs * 0] = c_0;
      a_0 = A[0 + bs * 1];
      c_0 = a_0 * b_0;
      D[0 + bs * 1] = c_0;
      a_0 = A[0 + bs * 2];
      c_0 = a_0 * b_0;
      D[0 + bs * 2] = c_0;
      a_0 = A[0 + bs * 3];
      c_0 = a_0 * b_0;
      D[0 + bs * 3] = c_0;
      A += 1;
      D += 1;
    }
  } else {
    for (k = 0; k < kmax - 3; k += 4) {
      a_0 = A[0 + bs * 0];
      a_1 = A[1 + bs * 0];
      a_2 = A[2 + bs * 0];
      a_3 = A[3 + bs * 0];
      c_0 = C[0 + bs * 0] + a_0 * b_0;
      c_1 = C[1 + bs * 0] + a_1 * b_0;
      c_2 = C[2 + bs * 0] + a_2 * b_0;
      c_3 = C[3 + bs * 0] + a_3 * b_0;
      D[0 + bs * 0] = c_0;
      D[1 + bs * 0] = c_1;
      D[2 + bs * 0] = c_2;
      D[3 + bs * 0] = c_3;
      a_0 = A[0 + bs * 1];
      a_1 = A[1 + bs * 1];
      a_2 = A[2 + bs * 1];
      a_3 = A[3 + bs * 1];
      c_0 = C[0 + bs * 1] + a_0 * b_1;
      c_1 = C[1 + bs * 1] + a_1 * b_1;
      c_2 = C[2 + bs * 1] + a_2 * b_1;
      c_3 = C[3 + bs * 1] + a_3 * b_1;
      D[0 + bs * 1] = c_0;
      D[1 + bs * 1] = c_1;
      D[2 + bs * 1] = c_2;
      D[3 + bs * 1] = c_3;
      a_0 = A[0 + bs * 2];
      a_1 = A[1 + bs * 2];
      a_2 = A[2 + bs * 2];
      a_3 = A[3 + bs * 2];
      c_0 = C[0 + bs * 2] + a_0 * b_2;
      c_1 = C[1 + bs * 2] + a_1 * b_2;
      c_2 = C[2 + bs * 2] + a_2 * b_2;
      c_3 = C[3 + bs * 2] + a_3 * b_2;
      D[0 + bs * 2] = c_0;
      D[1 + bs * 2] = c_1;
      D[2 + bs * 2] = c_2;
      D[3 + bs * 2] = c_3;
      a_0 = A[0 + bs * 3];
      a_1 = A[1 + bs * 3];
      a_2 = A[2 + bs * 3];
      a_3 = A[3 + bs * 3];
      c_0 = C[0 + bs * 3] + a_0 * b_3;
      c_1 = C[1 + bs * 3] + a_1 * b_3;
      c_2 = C[2 + bs * 3] + a_2 * b_3;
      c_3 = C[3 + bs * 3] + a_3 * b_3;
      D[0 + bs * 3] = c_0;
      D[1 + bs * 3] = c_1;
      D[2 + bs * 3] = c_2;
      D[3 + bs * 3] = c_3;
      A += 4 * sda;
      C += 4 * sdc;
      D += 4 * sdd;
    }
    for (; k < kmax; k++) {
      a_0 = A[0 + bs * 0];
      c_0 = C[0 + bs * 0] + a_0 * b_0;
      D[0 + bs * 0] = c_0;
      a_0 = A[0 + bs * 1];
      c_0 = C[0 + bs * 1] + a_0 * b_1;
      D[0 + bs * 1] = c_0;
      a_0 = A[0 + bs * 2];
      c_0 = C[0 + bs * 2] + a_0 * b_2;
      D[0 + bs * 2] = c_0;
      a_0 = A[0 + bs * 3];
      c_0 = C[0 + bs * 3] + a_0 * b_3;
      D[0 + bs * 3] = c_0;
      A += 1;
      C += 1;
      D += 1;
    }
  }
}


x86 assembly (clang, -O0):
<kernel_dgemm_diag_right_4_lib4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x18,%rsp
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     1137 <kernel_dgemm_diag_right_4_lib4+0x37>
jmp    1bfb <kernel_dgemm_diag_right_4_lib4+0xafb>
movl   $0x4,-0x30(%rbp)
cmpl   $0xffffffff,0x20(%rbp)
jne    11e0 <kernel_dgemm_diag_right_4_lib4+0xe0>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x78(%rbp)
jmp    1217 <kernel_dgemm_diag_right_4_lib4+0x117>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
cmpl   $0x0,0x20(%rbp)
jne    1653 <kernel_dgemm_diag_right_4_lib4+0x553>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    156d <kernel_dgemm_diag_right_4_lib4+0x46d>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
mulsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
mulsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x48(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x50(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x58(%rax)
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
mulsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
mulsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x68(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x70(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%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    0x18(%rbp),%ecx
shl    $0x2,%ecx
mov    0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,0x10(%rbp)
mov    -0x34(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x34(%rbp)
jmp    1228 <kernel_dgemm_diag_right_4_lib4+0x128>
jmp    1572 <kernel_dgemm_diag_right_4_lib4+0x472>
mov    -0x34(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    164e <kernel_dgemm_diag_right_4_lib4+0x54e>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x40(%rax)
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x60(%rax)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,0x10(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1572 <kernel_dgemm_diag_right_4_lib4+0x472>
jmp    1bfb <kernel_dgemm_diag_right_4_lib4+0xafb>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1ac6 <kernel_dgemm_diag_right_4_lib4+0x9c6>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm1
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x10(%rax),%xmm1
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x18(%rax),%xmm1
movsd  -0x58(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x20(%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x28(%rax),%xmm1
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x30(%rax),%xmm1
movsd  -0x50(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x38(%rax),%xmm1
movsd  -0x58(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x40(%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x48(%rax),%xmm1
movsd  -0x48(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x50(%rax),%xmm1
movsd  -0x50(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x58(%rax),%xmm1
movsd  -0x58(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x48(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x50(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x58(%rax)
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x60(%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x78(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x68(%rax),%xmm1
movsd  -0x48(%rbp),%xmm0
movsd  -0x78(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x70(%rax),%xmm1
movsd  -0x50(%rbp),%xmm0
movsd  -0x78(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x78(%rax),%xmm1
movsd  -0x58(%rbp),%xmm0
movsd  -0x78(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x68(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x70(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%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    -0x2c(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    0x18(%rbp),%ecx
shl    $0x2,%ecx
mov    0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,0x10(%rbp)
mov    -0x34(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x34(%rbp)
jmp    165a <kernel_dgemm_diag_right_4_lib4+0x55a>
jmp    1acb <kernel_dgemm_diag_right_4_lib4+0x9cb>
mov    -0x34(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1bf6 <kernel_dgemm_diag_right_4_lib4+0xaf6>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x20(%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x40(%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x40(%rax)
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x28(%rbp),%rax
movsd  0x60(%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x78(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x60(%rax)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x28(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x28(%rbp)
mov    0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,0x10(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1acb <kernel_dgemm_diag_right_4_lib4+0x9cb>
jmp    1bfb <kernel_dgemm_diag_right_4_lib4+0xafb>
add    $0x18,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dgemm_diag_right_4_lib4>:
push   %rbp
push   %r14
push   %rbx
test   %edi,%edi
jle    15e3 <kernel_dgemm_diag_right_4_lib4+0x4e3>
mov    0x30(%rsp),%ebx
mov    0x28(%rsp),%ebp
mov    0x20(%rsp),%rax
movsd  (%rcx),%xmm8
cmp    $0xffffffff,%ebx
je     1301 <kernel_dgemm_diag_right_4_lib4+0x201>
movsd  0x8(%rcx),%xmm9
movupd 0x10(%rcx),%xmm2
test   %ebx,%ebx
jne    1322 <kernel_dgemm_diag_right_4_lib4+0x222>
xor    %r9d,%r9d
cmp    $0x4,%edi
jb     1205 <kernel_dgemm_diag_right_4_lib4+0x105>
lea    -0x3(%rdi),%r8d
shl    $0x2,%edx
movslq %edx,%rdx
shl    $0x2,%ebp
movslq %ebp,%rcx
movapd %xmm8,%xmm3
unpcklpd %xmm8,%xmm3
unpcklpd %xmm9,%xmm9
movapd %xmm2,%xmm4
unpcklpd %xmm2,%xmm4
unpckhpd %xmm2,%xmm2
shl    $0x3,%rdx
shl    $0x3,%rcx
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
movupd (%rsi),%xmm5
movupd 0x10(%rsi),%xmm6
mulpd  %xmm3,%xmm5
mulpd  %xmm3,%xmm6
movupd %xmm5,(%rax)
movupd %xmm6,0x10(%rax)
movupd 0x20(%rsi),%xmm5
movupd 0x30(%rsi),%xmm6
mulpd  %xmm9,%xmm5
mulpd  %xmm9,%xmm6
movupd %xmm5,0x20(%rax)
movupd %xmm6,0x30(%rax)
movupd 0x40(%rsi),%xmm5
movupd 0x50(%rsi),%xmm6
mulpd  %xmm4,%xmm5
mulpd  %xmm4,%xmm6
movupd %xmm5,0x40(%rax)
movupd %xmm6,0x50(%rax)
movupd 0x60(%rsi),%xmm5
movupd 0x70(%rsi),%xmm6
mulpd  %xmm2,%xmm5
mulpd  %xmm2,%xmm6
movupd %xmm5,0x60(%rax)
movupd %xmm6,0x70(%rax)
add    $0x4,%ebx
add    %rdx,%rsi
add    %rcx,%rax
cmp    %r8d,%ebx
jl     1180 <kernel_dgemm_diag_right_4_lib4+0x80>
mov    %edi,%r9d
and    $0xfffffffc,%r9d
cmp    %edi,%r9d
jge    15e3 <kernel_dgemm_diag_right_4_lib4+0x4e3>
mov    %r9d,%edx
not    %edx
add    %edi,%edx
je     163e <kernel_dgemm_diag_right_4_lib4+0x53e>
lea    (%rsi,%rdx,8),%rcx
add    $0x68,%rcx
cmp    %rcx,%rax
jae    1239 <kernel_dgemm_diag_right_4_lib4+0x139>
lea    (%rax,%rdx,8),%rcx
add    $0x68,%rcx
cmp    %rcx,%rsi
jb     163e <kernel_dgemm_diag_right_4_lib4+0x53e>
add    $0x1,%rdx
mov    %rdx,%r8
and    $0xfffffffffffffffe,%r8
movapd %xmm8,%xmm1
unpcklpd %xmm8,%xmm1
lea    -0x2(%r8),%rcx
mov    %rcx,%r10
shr    %r10
add    $0x1,%r10
test   %rcx,%rcx
je     15e8 <kernel_dgemm_diag_right_4_lib4+0x4e8>
mov    %r10,%rbx
and    $0xfffffffffffffffe,%rbx
xor    %ecx,%ecx
xchg   %ax,%ax
movupd (%rsi,%rcx,8),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,(%rax,%rcx,8)
movupd 0x20(%rsi,%rcx,8),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,0x20(%rax,%rcx,8)
movupd 0x40(%rsi,%rcx,8),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,0x40(%rax,%rcx,8)
movupd 0x60(%rsi,%rcx,8),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,0x60(%rax,%rcx,8)
movupd 0x10(%rsi,%rcx,8),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,0x10(%rax,%rcx,8)
movupd 0x30(%rsi,%rcx,8),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,0x30(%rax,%rcx,8)
movupd 0x50(%rsi,%rcx,8),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,0x50(%rax,%rcx,8)
movupd 0x70(%rsi,%rcx,8),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,0x70(%rax,%rcx,8)
add    $0x4,%rcx
add    $0xfffffffffffffffe,%rbx
jne    1270 <kernel_dgemm_diag_right_4_lib4+0x170>
jmp    15ea <kernel_dgemm_diag_right_4_lib4+0x4ea>
movapd 0xcf7(%rip),%xmm3
xorpd  %xmm3,%xmm8
movsd  0x8(%rcx),%xmm9
xorpd  %xmm3,%xmm9
movupd 0x10(%rcx),%xmm2
xorpd  %xmm3,%xmm2
xor    %r10d,%r10d
movapd %xmm2,%xmm3
unpckhpd %xmm2,%xmm3
cmp    $0x4,%edi
jb     1459 <kernel_dgemm_diag_right_4_lib4+0x359>
lea    -0x3(%rdi),%r10d
shl    $0x2,%edx
movslq %edx,%r11
shl    $0x2,%r9d
movslq %r9d,%r9
shl    $0x2,%ebp
movslq %ebp,%rdx
movapd %xmm8,%xmm4
unpcklpd %xmm8,%xmm4
movapd %xmm9,%xmm5
unpcklpd %xmm9,%xmm5
movapd %xmm2,%xmm6
unpcklpd %xmm2,%xmm6
shl    $0x3,%r11
shl    $0x3,%r9
shl    $0x3,%rdx
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movupd (%rsi),%xmm0
movupd 0x10(%rsi),%xmm7
mulpd  %xmm4,%xmm0
movupd (%r8),%xmm1
addpd  %xmm0,%xmm1
movupd 0x10(%r8),%xmm0
mulpd  %xmm4,%xmm7
addpd  %xmm0,%xmm7
movupd %xmm1,(%rax)
movupd %xmm7,0x10(%rax)
movupd 0x20(%rsi),%xmm0
movupd 0x30(%rsi),%xmm1
mulpd  %xmm5,%xmm0
movupd 0x20(%r8),%xmm7
addpd  %xmm0,%xmm7
movupd 0x30(%r8),%xmm0
mulpd  %xmm5,%xmm1
addpd  %xmm0,%xmm1
movupd %xmm7,0x20(%rax)
movupd %xmm1,0x30(%rax)
movupd 0x40(%rsi),%xmm0
movupd 0x50(%rsi),%xmm1
mulpd  %xmm6,%xmm0
movupd 0x40(%r8),%xmm7
addpd  %xmm0,%xmm7
movupd 0x50(%r8),%xmm0
mulpd  %xmm6,%xmm1
addpd  %xmm0,%xmm1
movupd %xmm7,0x40(%rax)
movupd %xmm1,0x50(%rax)
movupd 0x60(%rsi),%xmm0
movupd 0x70(%rsi),%xmm1
mulpd  %xmm3,%xmm0
movupd 0x60(%r8),%xmm7
addpd  %xmm0,%xmm7
movupd 0x70(%r8),%xmm0
mulpd  %xmm3,%xmm1
addpd  %xmm0,%xmm1
movupd %xmm7,0x60(%rax)
movupd %xmm1,0x70(%rax)
add    $0x4,%ecx
add    %r11,%rsi
add    %r9,%r8
add    %rdx,%rax
cmp    %r10d,%ecx
jl     1380 <kernel_dgemm_diag_right_4_lib4+0x280>
mov    %edi,%r10d
and    $0xfffffffc,%r10d
cmp    %edi,%r10d
jge    15e3 <kernel_dgemm_diag_right_4_lib4+0x4e3>
mov    %r10d,%r11d
not    %r11d
add    %edi,%r11d
je     1569 <kernel_dgemm_diag_right_4_lib4+0x469>
lea    (%rax,%r11,8),%rdx
add    $0x68,%rdx
lea    (%rsi,%r11,8),%rcx
add    $0x68,%rcx
lea    (%r8,%r11,8),%rbp
add    $0x68,%rbp
cmp    %rcx,%rax
setb   %r9b
cmp    %rdx,%rsi
setb   %bl
cmp    %rbp,%rax
setb   %cl
cmp    %rdx,%r8
setb   %dl
test   %bl,%r9b
jne    1569 <kernel_dgemm_diag_right_4_lib4+0x469>
and    %dl,%cl
jne    1569 <kernel_dgemm_diag_right_4_lib4+0x469>
add    $0x1,%r11
mov    %r11,%r14
and    $0xfffffffffffffffe,%r14
add    %r14d,%r10d
lea    (%rsi,%r14,8),%r9
lea    (%r8,%r14,8),%rcx
lea    (%rax,%r14,8),%rdx
movapd %xmm8,%xmm4
unpcklpd %xmm8,%xmm4
movapd %xmm9,%xmm5
unpcklpd %xmm9,%xmm5
movapd %xmm2,%xmm6
unpcklpd %xmm2,%xmm6
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
movupd (%rsi,%rbx,8),%xmm7
mulpd  %xmm4,%xmm7
movupd (%r8,%rbx,8),%xmm0
addpd  %xmm7,%xmm0
movupd %xmm0,(%rax,%rbx,8)
movupd 0x20(%rsi,%rbx,8),%xmm0
mulpd  %xmm5,%xmm0
movupd 0x20(%r8,%rbx,8),%xmm7
addpd  %xmm0,%xmm7
movupd %xmm7,0x20(%rax,%rbx,8)
movupd 0x40(%rsi,%rbx,8),%xmm0
mulpd  %xmm6,%xmm0
movupd 0x40(%r8,%rbx,8),%xmm7
addpd  %xmm0,%xmm7
movupd %xmm7,0x40(%rax,%rbx,8)
movupd 0x60(%rsi,%rbx,8),%xmm0
movupd 0x60(%r8,%rbx,8),%xmm7
mulpd  %xmm3,%xmm0
addpd  %xmm7,%xmm0
movupd %xmm0,0x60(%rax,%rbx,8)
add    $0x2,%rbx
cmp    %rbx,%r14
jne    14f0 <kernel_dgemm_diag_right_4_lib4+0x3f0>
cmp    %r14,%r11
jne    1572 <kernel_dgemm_diag_right_4_lib4+0x472>
jmp    15e3 <kernel_dgemm_diag_right_4_lib4+0x4e3>
mov    %rsi,%r9
mov    %r8,%rcx
mov    %rax,%rdx
sub    %r10d,%edi
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movsd  (%r9,%rax,8),%xmm0
mulsd  %xmm8,%xmm0
addsd  (%rcx,%rax,8),%xmm0
movsd  %xmm0,(%rdx,%rax,8)
movsd  0x20(%r9,%rax,8),%xmm0
mulsd  %xmm9,%xmm0
addsd  0x20(%rcx,%rax,8),%xmm0
movsd  %xmm0,0x20(%rdx,%rax,8)
movsd  0x40(%r9,%rax,8),%xmm0
mulsd  %xmm2,%xmm0
addsd  0x40(%rcx,%rax,8),%xmm0
movsd  %xmm0,0x40(%rdx,%rax,8)
movsd  0x60(%r9,%rax,8),%xmm0
mulsd  %xmm3,%xmm0
addsd  0x60(%rcx,%rax,8),%xmm0
movsd  %xmm0,0x60(%rdx,%rax,8)
add    $0x1,%rax
cmp    %eax,%edi
jne    1580 <kernel_dgemm_diag_right_4_lib4+0x480>
pop    %rbx
pop    %r14
pop    %rbp
ret
xor    %ecx,%ecx
test   $0x1,%r10b
je     162e <kernel_dgemm_diag_right_4_lib4+0x52e>
movupd (%rsi,%rcx,8),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,(%rax,%rcx,8)
movupd 0x20(%rsi,%rcx,8),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,0x20(%rax,%rcx,8)
movupd 0x40(%rsi,%rcx,8),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,0x40(%rax,%rcx,8)
movupd 0x60(%rsi,%rcx,8),%xmm2
mulpd  %xmm1,%xmm2
movupd %xmm2,0x60(%rax,%rcx,8)
cmp    %r8,%rdx
je     15e3 <kernel_dgemm_diag_right_4_lib4+0x4e3>
add    %r8d,%r9d
lea    (%rsi,%r8,8),%rsi
lea    (%rax,%r8,8),%rax
mov    %edi,%edx
sub    %r9d,%edx
mov    %r9d,%ecx
not    %ecx
test   $0x1,%dl
je     1693 <kernel_dgemm_diag_right_4_lib4+0x593>
movsd  (%rsi),%xmm1
mulsd  %xmm8,%xmm1
movsd  %xmm1,(%rax)
movsd  0x20(%rsi),%xmm1
mulsd  %xmm8,%xmm1
movsd  %xmm1,0x20(%rax)
movsd  0x40(%rsi),%xmm1
mulsd  %xmm8,%xmm1
movsd  %xmm1,0x40(%rax)
movsd  0x60(%rsi),%xmm1
mulsd  %xmm8,%xmm1
movsd  %xmm1,0x60(%rax)
add    $0x8,%rsi
add    $0x8,%rax
add    $0x1,%r9d
add    %edi,%ecx
je     15e3 <kernel_dgemm_diag_right_4_lib4+0x4e3>
sub    %r9d,%edi
xor    %ecx,%ecx
movsd  (%rsi,%rcx,8),%xmm1
mulsd  %xmm8,%xmm1
movsd  %xmm1,(%rax,%rcx,8)
movsd  0x20(%rsi,%rcx,8),%xmm1
mulsd  %xmm8,%xmm1
movsd  %xmm1,0x20(%rax,%rcx,8)
movsd  0x40(%rsi,%rcx,8),%xmm1
mulsd  %xmm8,%xmm1
movsd  %xmm1,0x40(%rax,%rcx,8)
movsd  0x60(%rsi,%rcx,8),%xmm1
mulsd  %xmm8,%xmm1
movsd  %xmm1,0x60(%rax,%rcx,8)
movsd  0x8(%rsi,%rcx,8),%xmm1
mulsd  %xmm8,%xmm1
movsd  %xmm1,0x8(%rax,%rcx,8)
movsd  0x28(%rsi,%rcx,8),%xmm1
mulsd  %xmm8,%xmm1
movsd  %xmm1,0x28(%rax,%rcx,8)
movsd  0x48(%rsi,%rcx,8),%xmm1
mulsd  %xmm8,%xmm1
movsd  %xmm1,0x48(%rax,%rcx,8)
movsd  0x68(%rsi,%rcx,8),%xmm1
mulsd  %xmm8,%xmm1
movsd  %xmm1,0x68(%rax,%rcx,8)
add    $0x2,%rcx
cmp    %ecx,%edi
jne    16a0 <kernel_dgemm_diag_right_4_lib4+0x5a0>
jmp    15e3 <kernel_dgemm_diag_right_4_lib4+0x4e3>

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

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