void kernel_dsyttmm_lu_nt_4x4_lib4(int kmax, double *A, double *C) {
  const int lda = 4;
  const int ldc = 4;
  int k;
  double a_0, a_1, a_2, a_3, c_00 = 0, c_10 = 0, c_11 = 0, c_20 = 0, c_21 = 0,
                             c_22 = 0, c_30 = 0, c_31 = 0, c_32 = 0, c_33 = 0;
  for (k = 0; k < kmax - 4; k += 4) {
    a_0 = A[0 + lda * 0];
    a_1 = A[1 + lda * 0];
    a_2 = A[2 + lda * 0];
    a_3 = A[3 + lda * 0];
    c_00 += a_0 * a_0;
    c_10 += a_1 * a_0;
    c_20 += a_2 * a_0;
    c_30 += a_3 * a_0;
    c_11 += a_1 * a_1;
    c_21 += a_2 * a_1;
    c_31 += a_3 * a_1;
    c_22 += a_2 * a_2;
    c_32 += a_3 * a_2;
    c_33 += a_3 * a_3;
    a_0 = A[0 + lda * 1];
    a_1 = A[1 + lda * 1];
    a_2 = A[2 + lda * 1];
    a_3 = A[3 + lda * 1];
    c_00 += a_0 * a_0;
    c_10 += a_1 * a_0;
    c_20 += a_2 * a_0;
    c_30 += a_3 * a_0;
    c_11 += a_1 * a_1;
    c_21 += a_2 * a_1;
    c_31 += a_3 * a_1;
    c_22 += a_2 * a_2;
    c_32 += a_3 * a_2;
    c_33 += a_3 * a_3;
    a_0 = A[0 + lda * 2];
    a_1 = A[1 + lda * 2];
    a_2 = A[2 + lda * 2];
    a_3 = A[3 + lda * 2];
    c_00 += a_0 * a_0;
    c_10 += a_1 * a_0;
    c_20 += a_2 * a_0;
    c_30 += a_3 * a_0;
    c_11 += a_1 * a_1;
    c_21 += a_2 * a_1;
    c_31 += a_3 * a_1;
    c_22 += a_2 * a_2;
    c_32 += a_3 * a_2;
    c_33 += a_3 * a_3;
    a_0 = A[0 + lda * 3];
    a_1 = A[1 + lda * 3];
    a_2 = A[2 + lda * 3];
    a_3 = A[3 + lda * 3];
    c_00 += a_0 * a_0;
    c_10 += a_1 * a_0;
    c_20 += a_2 * a_0;
    c_30 += a_3 * a_0;
    c_11 += a_1 * a_1;
    c_21 += a_2 * a_1;
    c_31 += a_3 * a_1;
    c_22 += a_2 * a_2;
    c_32 += a_3 * a_2;
    c_33 += a_3 * a_3;
    A += 16;
  }
  a_0 = A[0 + lda * 0];
  a_1 = A[1 + lda * 0];
  a_2 = A[2 + lda * 0];
  a_3 = A[3 + lda * 0];
  c_00 += a_0 * a_0;
  c_10 += a_1 * a_0;
  c_20 += a_2 * a_0;
  c_30 += a_3 * a_0;
  c_11 += a_1 * a_1;
  c_21 += a_2 * a_1;
  c_31 += a_3 * a_1;
  c_22 += a_2 * a_2;
  c_32 += a_3 * a_2;
  c_33 += a_3 * a_3;
  a_1 = A[1 + lda * 1];
  a_2 = A[2 + lda * 1];
  a_3 = A[3 + lda * 1];
  c_11 += a_1 * a_1;
  c_21 += a_2 * a_1;
  c_31 += a_3 * a_1;
  c_22 += a_2 * a_2;
  c_32 += a_3 * a_2;
  c_33 += a_3 * a_3;
  a_2 = A[2 + lda * 2];
  a_3 = A[3 + lda * 2];
  c_22 += a_2 * a_2;
  c_32 += a_3 * a_2;
  c_33 += a_3 * a_3;
  a_3 = A[3 + lda * 3];
  c_33 += a_3 * a_3;
  C[0 + ldc * 0] = c_00;
  C[1 + ldc * 0] = c_10;
  C[2 + ldc * 0] = c_20;
  C[3 + ldc * 0] = c_30;
  C[1 + ldc * 1] = c_11;
  C[2 + ldc * 1] = c_21;
  C[3 + ldc * 1] = c_31;
  C[2 + ldc * 2] = c_22;
  C[3 + ldc * 2] = c_32;
  C[3 + ldc * 3] = c_33;
}


x86 assembly (clang, -O0):
<kernel_dsyttmm_lu_nt_4x4_lib4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x18,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x4,-0x1c(%rbp)
movl   $0x4,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x80(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x4,%ecx
cmp    %ecx,%eax
jge    1735 <kernel_dsyttmm_lu_nt_4x4_lib4+0x635>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x10(%rbp)
mov    -0x24(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x24(%rbp)
jmp    1181 <kernel_dsyttmm_lu_nt_4x4_lib4+0x81>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x58(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x18(%rax)
movsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x70(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x38(%rax)
movsd  -0x78(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x50(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x58(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x78(%rax)
add    $0x18,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dsyttmm_lu_nt_4x4_lib4>:
xorpd  %xmm8,%xmm8
cmp    $0x5,%edi
jl     130e <kernel_dsyttmm_lu_nt_4x4_lib4+0x20e>
add    $0xfffffffc,%edi
xorpd  %xmm9,%xmm9
xor    %eax,%eax
xorpd  %xmm11,%xmm11
xorpd  %xmm12,%xmm12
xorpd  %xmm13,%xmm13
xorpd  %xmm14,%xmm14
nopl   0x0(%rax)
movupd (%rsi),%xmm3
movupd 0x10(%rsi),%xmm1
movupd 0x20(%rsi),%xmm2
movupd 0x30(%rsi),%xmm15
movapd %xmm3,%xmm4
unpcklpd %xmm3,%xmm4
movapd %xmm3,%xmm7
mulpd  %xmm4,%xmm7
addpd  %xmm9,%xmm7
mulpd  %xmm1,%xmm4
addpd  %xmm11,%xmm4
movapd %xmm3,%xmm6
shufpd $0x1,%xmm1,%xmm6
movapd %xmm3,%xmm5
unpckhpd %xmm3,%xmm5
mulpd  %xmm6,%xmm5
addpd  %xmm12,%xmm5
movapd %xmm1,%xmm6
unpcklpd %xmm1,%xmm6
mulpd  %xmm1,%xmm6
addpd  %xmm13,%xmm6
unpckhpd %xmm1,%xmm3
unpckhpd %xmm1,%xmm1
mulpd  %xmm3,%xmm1
addpd  %xmm14,%xmm1
movapd %xmm2,%xmm3
unpcklpd %xmm2,%xmm3
movapd %xmm2,%xmm8
mulpd  %xmm3,%xmm8
addpd  %xmm7,%xmm8
mulpd  %xmm15,%xmm3
addpd  %xmm4,%xmm3
movapd %xmm2,%xmm7
shufpd $0x1,%xmm15,%xmm7
movapd %xmm2,%xmm4
unpckhpd %xmm2,%xmm4
mulpd  %xmm7,%xmm4
addpd  %xmm5,%xmm4
movapd %xmm15,%xmm7
unpcklpd %xmm15,%xmm7
mulpd  %xmm15,%xmm7
addpd  %xmm6,%xmm7
unpckhpd %xmm15,%xmm2
unpckhpd %xmm15,%xmm15
mulpd  %xmm2,%xmm15
addpd  %xmm1,%xmm15
movupd 0x40(%rsi),%xmm0
movupd 0x50(%rsi),%xmm6
movapd %xmm0,%xmm2
unpcklpd %xmm0,%xmm2
movapd %xmm0,%xmm10
mulpd  %xmm2,%xmm10
addpd  %xmm8,%xmm10
mulpd  %xmm6,%xmm2
addpd  %xmm3,%xmm2
movapd %xmm0,%xmm1
shufpd $0x1,%xmm6,%xmm1
movapd %xmm0,%xmm5
unpckhpd %xmm0,%xmm5
mulpd  %xmm1,%xmm5
addpd  %xmm4,%xmm5
movapd %xmm6,%xmm1
unpcklpd %xmm6,%xmm1
mulpd  %xmm6,%xmm1
addpd  %xmm7,%xmm1
unpckhpd %xmm6,%xmm0
unpckhpd %xmm6,%xmm6
mulpd  %xmm0,%xmm6
addpd  %xmm15,%xmm6
movupd 0x60(%rsi),%xmm3
movupd 0x70(%rsi),%xmm0
movapd %xmm3,%xmm4
unpcklpd %xmm3,%xmm4
movapd %xmm3,%xmm8
mulpd  %xmm4,%xmm8
movapd %xmm8,%xmm9
addpd  %xmm10,%xmm9
mulpd  %xmm0,%xmm4
movapd %xmm4,%xmm11
addpd  %xmm2,%xmm11
movapd %xmm3,%xmm12
shufpd $0x1,%xmm0,%xmm12
movapd %xmm3,%xmm7
unpckhpd %xmm3,%xmm7
mulpd  %xmm12,%xmm7
movapd %xmm7,%xmm12
addpd  %xmm5,%xmm12
movapd %xmm0,%xmm15
unpcklpd %xmm0,%xmm15
mulpd  %xmm0,%xmm15
movapd %xmm15,%xmm13
addpd  %xmm1,%xmm13
unpckhpd %xmm0,%xmm3
unpckhpd %xmm0,%xmm0
mulpd  %xmm3,%xmm0
movapd %xmm0,%xmm14
addpd  %xmm6,%xmm14
sub    $0xffffffffffffff80,%rsi
add    $0x4,%eax
cmp    %edi,%eax
jl     1130 <kernel_dsyttmm_lu_nt_4x4_lib4+0x30>
addpd  %xmm6,%xmm0
addpd  %xmm1,%xmm15
addpd  %xmm5,%xmm7
addpd  %xmm2,%xmm4
addpd  %xmm10,%xmm8
jmp    131f <kernel_dsyttmm_lu_nt_4x4_lib4+0x21f>
xorpd  %xmm4,%xmm4
xorpd  %xmm7,%xmm7
xorpd  %xmm15,%xmm15
xorpd  %xmm0,%xmm0
movupd (%rsi),%xmm6
movupd 0x10(%rsi),%xmm2
movupd 0x28(%rsi),%xmm5
movapd %xmm6,%xmm1
unpcklpd %xmm6,%xmm1
movapd %xmm6,%xmm9
mulpd  %xmm1,%xmm9
addpd  %xmm8,%xmm9
mulpd  %xmm2,%xmm1
addpd  %xmm4,%xmm1
movapd %xmm6,%xmm4
unpckhpd %xmm6,%xmm4
shufpd $0x1,%xmm2,%xmm6
mulpd  %xmm4,%xmm6
addpd  %xmm7,%xmm6
movapd %xmm2,%xmm3
unpcklpd %xmm2,%xmm3
mulpd  %xmm2,%xmm3
unpckhpd %xmm2,%xmm2
mulsd  %xmm2,%xmm4
addsd  %xmm0,%xmm4
addpd  %xmm15,%xmm3
unpckhpd %xmm0,%xmm0
mulsd  %xmm2,%xmm2
addsd  %xmm0,%xmm2
movsd  0x38(%rsi),%xmm7
movapd %xmm5,%xmm0
unpcklpd %xmm5,%xmm0
mulpd  %xmm5,%xmm0
addpd  %xmm6,%xmm0
movapd %xmm7,%xmm6
mulsd  %xmm5,%xmm6
addsd  %xmm4,%xmm6
movapd %xmm5,%xmm4
shufpd $0x1,%xmm7,%xmm4
unpckhpd %xmm5,%xmm5
mulpd  %xmm4,%xmm5
addpd  %xmm3,%xmm5
mulsd  %xmm7,%xmm7
addsd  %xmm2,%xmm7
movupd 0x50(%rsi),%xmm2
movapd %xmm2,%xmm3
unpcklpd %xmm2,%xmm3
mulpd  %xmm2,%xmm3
addpd  %xmm5,%xmm3
unpckhpd %xmm2,%xmm2
mulsd  %xmm2,%xmm2
addsd  %xmm7,%xmm2
movsd  0x78(%rsi),%xmm4
mulsd  %xmm4,%xmm4
addsd  %xmm2,%xmm4
movupd %xmm9,(%rdx)
movupd %xmm1,0x10(%rdx)
movupd %xmm0,0x28(%rdx)
movsd  %xmm6,0x38(%rdx)
movupd %xmm3,0x50(%rdx)
movsd  %xmm4,0x78(%rdx)
ret

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

LLVM IR (-O2):
define void @kernel_dsyttmm_lu_nt_4x4_lib4(i32 %0, double* %1, double* nocapture writeonly %2) {
%4 = add nsw i32 %0, -4
%5 = icmp sgt i32 %0, 4
br i1 %5, label %6, label %109
6: ; preds = %3, %6
%7 = phi i32 [ %86, %6 ], [ 0, %3 ]
%8 = phi double* [ %85, %6 ], [ %1, %3 ]
%9 = phi <2 x double> [ %74, %6 ], [ zeroinitializer, %3 ]
%10 = phi <2 x double> [ %75, %6 ], [ zeroinitializer, %3 ]
%11 = phi <2 x double> [ %79, %6 ], [ zeroinitializer, %3 ]
%12 = phi <2 x double> [ %81, %6 ], [ zeroinitializer, %3 ]
%13 = phi <2 x double> [ %84, %6 ], [ zeroinitializer, %3 ]
%14 = bitcast double* %8 to <2 x double>*
%15 = load <2 x double>, <2 x double>* %14
%16 = getelementptr inbounds double, double* %8, i64 2
%17 = bitcast double* %16 to <2 x double>*
%18 = load <2 x double>, <2 x double>* %17
%19 = shufflevector <2 x double> %15, <2 x double> undef, <2 x i32> zeroinitializer
%20 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %15, <2 x double> %19, <2 x double> %9)
%21 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %18, <2 x double> %19, <2 x double> %10)
%22 = shufflevector <2 x double> %15, <2 x double> undef, <2 x i32> <i32 1, i32 undef>
%23 = shufflevector <2 x double> %22, <2 x double> %18, <2 x i32> <i32 0, i32 2>
%24 = shufflevector <2 x double> %15, <2 x double> poison, <2 x i32> <i32 1, i32 1>
%25 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %23, <2 x double> %24, <2 x double> %11)
%26 = shufflevector <2 x double> %18, <2 x double> undef, <2 x i32> zeroinitializer
%27 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %18, <2 x double> %26, <2 x double> %12)
%28 = shufflevector <2 x double> %18, <2 x double> undef, <2 x i32> <i32 1, i32 1>
%29 = shufflevector <2 x double> %22, <2 x double> %18, <2 x i32> <i32 0, i32 3>
%30 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %28, <2 x double> %29, <2 x double> %13)
%31 = getelementptr inbounds double, double* %8, i64 4
%32 = bitcast double* %31 to <2 x double>*
%33 = load <2 x double>, <2 x double>* %32
%34 = getelementptr inbounds double, double* %8, i64 6
%35 = bitcast double* %34 to <2 x double>*
%36 = load <2 x double>, <2 x double>* %35
%37 = shufflevector <2 x double> %33, <2 x double> undef, <2 x i32> zeroinitializer
%38 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %33, <2 x double> %37, <2 x double> %20)
%39 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %36, <2 x double> %37, <2 x double> %21)
%40 = shufflevector <2 x double> %33, <2 x double> undef, <2 x i32> <i32 1, i32 undef>
%41 = shufflevector <2 x double> %40, <2 x double> %36, <2 x i32> <i32 0, i32 2>
%42 = shufflevector <2 x double> %33, <2 x double> poison, <2 x i32> <i32 1, i32 1>
%43 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %41, <2 x double> %42, <2 x double> %25)
%44 = shufflevector <2 x double> %36, <2 x double> undef, <2 x i32> zeroinitializer
%45 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %36, <2 x double> %44, <2 x double> %27)
%46 = shufflevector <2 x double> %36, <2 x double> undef, <2 x i32> <i32 1, i32 1>
%47 = shufflevector <2 x double> %40, <2 x double> %36, <2 x i32> <i32 0, i32 3>
%48 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %46, <2 x double> %47, <2 x double> %30)
%49 = getelementptr inbounds double, double* %8, i64 8
%50 = bitcast double* %49 to <2 x double>*
%51 = load <2 x double>, <2 x double>* %50
%52 = getelementptr inbounds double, double* %8, i64 10
%53 = bitcast double* %52 to <2 x double>*
%54 = load <2 x double>, <2 x double>* %53
%55 = shufflevector <2 x double> %51, <2 x double> undef, <2 x i32> zeroinitializer
%56 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %51, <2 x double> %55, <2 x double> %38)
%57 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %54, <2 x double> %55, <2 x double> %39)
%58 = shufflevector <2 x double> %51, <2 x double> undef, <2 x i32> <i32 1, i32 undef>
%59 = shufflevector <2 x double> %58, <2 x double> %54, <2 x i32> <i32 0, i32 2>
%60 = shufflevector <2 x double> %51, <2 x double> poison, <2 x i32> <i32 1, i32 1>
%61 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %59, <2 x double> %60, <2 x double> %43)
%62 = shufflevector <2 x double> %54, <2 x double> undef, <2 x i32> zeroinitializer
%63 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %54, <2 x double> %62, <2 x double> %45)
%64 = shufflevector <2 x double> %54, <2 x double> undef, <2 x i32> <i32 1, i32 1>
%65 = shufflevector <2 x double> %58, <2 x double> %54, <2 x i32> <i32 0, i32 3>
%66 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %64, <2 x double> %65, <2 x double> %48)
%67 = getelementptr inbounds double, double* %8, i64 12
%68 = bitcast double* %67 to <2 x double>*
%69 = load <2 x double>, <2 x double>* %68
%70 = getelementptr inbounds double, double* %8, i64 14
%71 = bitcast double* %70 to <2 x double>*
%72 = load <2 x double>, <2 x double>* %71
%73 = shufflevector <2 x double> %69, <2 x double> undef, <2 x i32> zeroinitializer
%74 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %69, <2 x double> %73, <2 x double> %56)
%75 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %72, <2 x double> %73, <2 x double> %57)
%76 = shufflevector <2 x double> %69, <2 x double> undef, <2 x i32> <i32 1, i32 undef>
%77 = shufflevector <2 x double> %76, <2 x double> %72, <2 x i32> <i32 0, i32 2>
%78 = shufflevector <2 x double> %69, <2 x double> poison, <2 x i32> <i32 1, i32 1>
%79 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %77, <2 x double> %78, <2 x double> %61)
%80 = shufflevector <2 x double> %72, <2 x double> undef, <2 x i32> zeroinitializer
%81 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %72, <2 x double> %80, <2 x double> %63)
%82 = shufflevector <2 x double> %72, <2 x double> undef, <2 x i32> <i32 1, i32 1>
%83 = shufflevector <2 x double> %76, <2 x double> %72, <2 x i32> <i32 0, i32 3>
%84 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %82, <2 x double> %83, <2 x double> %66)
%85 = getelementptr inbounds double, double* %8, i64 16
%86 = add nuw nsw i32 %7, 4
%87 = icmp slt i32 %86, %4
br i1 %87, label %6, label %88
88: ; preds = %6
%89 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %28, <2 x double> %29, <2 x double> %13)
%90 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %46, <2 x double> %47, <2 x double> %89)
%91 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %64, <2 x double> %65, <2 x double> %90)
%92 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %82, <2 x double> %83, <2 x double> %91)
%93 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %18, <2 x double> %26, <2 x double> %12)
%94 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %36, <2 x double> %44, <2 x double> %93)
%95 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %54, <2 x double> %62, <2 x double> %94)
%96 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %72, <2 x double> %80, <2 x double> %95)
%97 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %23, <2 x double> %24, <2 x double> %11)
%98 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %41, <2 x double> %42, <2 x double> %97)
%99 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %59, <2 x double> %60, <2 x double> %98)
%100 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %77, <2 x double> %78, <2 x double> %99)
%101 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %18, <2 x double> %19, <2 x double> %10)
%102 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %36, <2 x double> %37, <2 x double> %101)
%103 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %54, <2 x double> %55, <2 x double> %102)
%104 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %72, <2 x double> %73, <2 x double> %103)
%105 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %15, <2 x double> %19, <2 x double> %9)
%106 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %33, <2 x double> %37, <2 x double> %105)
%107 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %51, <2 x double> %55, <2 x double> %106)
%108 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %69, <2 x double> %73, <2 x double> %107)
br label %109
109: ; preds = %88, %3
%110 = phi double* [ %1, %3 ], [ %85, %88 ]
%111 = phi <2 x double> [ zeroinitializer, %3 ], [ %108, %88 ]
%112 = phi <2 x double> [ zeroinitializer, %3 ], [ %104, %88 ]
%113 = phi <2 x double> [ zeroinitializer, %3 ], [ %100, %88 ]
%114 = phi <2 x double> [ zeroinitializer, %3 ], [ %96, %88 ]
%115 = phi <2 x double> [ zeroinitializer, %3 ], [ %92, %88 ]
%116 = bitcast double* %110 to <2 x double>*
%117 = load <2 x double>, <2 x double>* %116
%118 = getelementptr inbounds double, double* %110, i64 2
%119 = bitcast double* %118 to <2 x double>*
%120 = load <2 x double>, <2 x double>* %119
%121 = shufflevector <2 x double> %117, <2 x double> undef, <2 x i32> zeroinitializer
%122 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %117, <2 x double> %121, <2 x double> %111)
%123 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %120, <2 x double> %121, <2 x double> %112)
%124 = extractelement <2 x double> %117, i64 1
%125 = shufflevector <2 x double> %117, <2 x double> undef, <2 x i32> <i32 1, i32 undef>
%126 = shufflevector <2 x double> %125, <2 x double> %120, <2 x i32> <i32 0, i32 2>
%127 = shufflevector <2 x double> %117, <2 x double> poison, <2 x i32> <i32 1, i32 1>
%128 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %126, <2 x double> %127, <2 x double> %113)
%129 = extractelement <2 x double> %120, i64 1
%130 = extractelement <2 x double> %115, i64 0
%131 = tail call double @llvm.fmuladd.f64(double %129, double %124, double %130)
%132 = shufflevector <2 x double> %120, <2 x double> undef, <2 x i32> zeroinitializer
%133 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %120, <2 x double> %132, <2 x double> %114)
%134 = extractelement <2 x double> %115, i64 1
%135 = tail call double @llvm.fmuladd.f64(double %129, double %129, double %134)
%136 = getelementptr inbounds double, double* %110, i64 5
%137 = bitcast double* %136 to <2 x double>*
%138 = load <2 x double>, <2 x double>* %137
%139 = getelementptr inbounds double, double* %110, i64 7
%140 = load double, double* %139
%141 = extractelement <2 x double> %138, i64 0
%142 = shufflevector <2 x double> %138, <2 x double> undef, <2 x i32> zeroinitializer
%143 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %138, <2 x double> %142, <2 x double> %128)
%144 = tail call double @llvm.fmuladd.f64(double %140, double %141, double %131)
%145 = shufflevector <2 x double> %138, <2 x double> undef, <2 x i32> <i32 1, i32 undef>
%146 = insertelement <2 x double> %145, double %140, i64 1
%147 = shufflevector <2 x double> %138, <2 x double> poison, <2 x i32> <i32 1, i32 1>
%148 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %146, <2 x double> %147, <2 x double> %133)
%149 = tail call double @llvm.fmuladd.f64(double %140, double %140, double %135)
%150 = getelementptr inbounds double, double* %110, i64 10
%151 = bitcast double* %150 to <2 x double>*
%152 = load <2 x double>, <2 x double>* %151
%153 = shufflevector <2 x double> %152, <2 x double> undef, <2 x i32> zeroinitializer
%154 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %152, <2 x double> %153, <2 x double> %148)
%155 = extractelement <2 x double> %152, i64 1
%156 = tail call double @llvm.fmuladd.f64(double %155, double %155, double %149)
%157 = getelementptr inbounds double, double* %110, i64 15
%158 = load double, double* %157
%159 = tail call double @llvm.fmuladd.f64(double %158, double %158, double %156)
%160 = bitcast double* %2 to <2 x double>*
store <2 x double> %122, <2 x double>* %160
%161 = getelementptr inbounds double, double* %2, i64 2
%162 = bitcast double* %161 to <2 x double>*
store <2 x double> %123, <2 x double>* %162
%163 = getelementptr inbounds double, double* %2, i64 5
%164 = bitcast double* %163 to <2 x double>*
store <2 x double> %143, <2 x double>* %164
%165 = getelementptr inbounds double, double* %2, i64 7
store double %144, double* %165
%166 = getelementptr inbounds double, double* %2, i64 10
%167 = bitcast double* %166 to <2 x double>*
store <2 x double> %154, <2 x double>* %167
%168 = getelementptr inbounds double, double* %2, i64 15
store double %159, double* %168
ret void
}