void mvp5x5(const double *restrict a, const double *restrict v,
            double *restrict r) {
  double *pr;
  pr = r;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v++;
  pr = r;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v++;
  pr = r;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v++;
  pr = r;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v++;
  pr = r;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v;
  *pr++ += *a++ * *v++;
}


x86 assembly (clang, -O0):
<mvp5x5>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x10(%rbp)
movsd  (%rax),%xmm2
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<mvp5x5>:
movsd  (%rsi),%xmm2
movsd  0x8(%rsi),%xmm0
movapd %xmm2,%xmm3
unpcklpd %xmm2,%xmm3
movupd (%rdi),%xmm4
movupd 0x10(%rdi),%xmm5
movupd 0x28(%rdi),%xmm1
movupd 0x38(%rdi),%xmm6
mulpd  %xmm3,%xmm4
movupd (%rdx),%xmm7
addpd  %xmm4,%xmm7
movupd 0x10(%rdx),%xmm4
mulpd  %xmm3,%xmm5
addpd  %xmm4,%xmm5
mulsd  0x20(%rdi),%xmm2
addsd  0x20(%rdx),%xmm2
movapd %xmm0,%xmm3
unpcklpd %xmm0,%xmm3
mulpd  %xmm3,%xmm1
addpd  %xmm7,%xmm1
mulpd  %xmm6,%xmm3
addpd  %xmm5,%xmm3
mulsd  0x48(%rdi),%xmm0
addsd  %xmm2,%xmm0
movsd  0x10(%rsi),%xmm2
movupd 0x50(%rdi),%xmm4
movapd %xmm2,%xmm5
unpcklpd %xmm2,%xmm5
mulpd  %xmm5,%xmm4
addpd  %xmm1,%xmm4
movupd 0x60(%rdi),%xmm1
mulpd  %xmm5,%xmm1
addpd  %xmm3,%xmm1
mulsd  0x70(%rdi),%xmm2
addsd  %xmm0,%xmm2
movsd  0x18(%rsi),%xmm0
movupd 0x78(%rdi),%xmm3
movapd %xmm0,%xmm5
unpcklpd %xmm0,%xmm5
mulpd  %xmm5,%xmm3
addpd  %xmm4,%xmm3
movupd 0x88(%rdi),%xmm4
mulpd  %xmm5,%xmm4
mulsd  0x98(%rdi),%xmm0
addpd  %xmm1,%xmm4
addsd  %xmm2,%xmm0
movsd  0x20(%rsi),%xmm1
movupd 0xa0(%rdi),%xmm2
movapd %xmm1,%xmm5
unpcklpd %xmm1,%xmm5
mulpd  %xmm5,%xmm2
addpd  %xmm3,%xmm2
movupd %xmm2,(%rdx)
movupd 0xb0(%rdi),%xmm2
mulpd  %xmm5,%xmm2
addpd  %xmm4,%xmm2
movupd %xmm2,0x10(%rdx)
mulsd  0xc0(%rdi),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,0x20(%rdx)
ret

LLVM IR (-O0):
define void @mvp5x5(double* noalias %0, double* noalias %1, double* noalias %2) {
%4 = alloca double*
%5 = alloca double*
%6 = alloca double*
%7 = alloca double*
store double* %0, double** %4
store double* %1, double** %5
store double* %2, double** %6
%8 = load double*, double** %6
store double* %8, double** %7
%9 = load double*, double** %4
%10 = getelementptr inbounds double, double* %9, i32 1
store double* %10, double** %4
%11 = load double, double* %9
%12 = load double*, double** %5
%13 = load double, double* %12
%14 = load double*, double** %7
%15 = getelementptr inbounds double, double* %14, i32 1
store double* %15, double** %7
%16 = load double, double* %14
%17 = call double @llvm.fmuladd.f64(double %11, double %13, double %16)
store double %17, double* %14
%18 = load double*, double** %4
%19 = getelementptr inbounds double, double* %18, i32 1
store double* %19, double** %4
%20 = load double, double* %18
%21 = load double*, double** %5
%22 = load double, double* %21
%23 = load double*, double** %7
%24 = getelementptr inbounds double, double* %23, i32 1
store double* %24, double** %7
%25 = load double, double* %23
%26 = call double @llvm.fmuladd.f64(double %20, double %22, double %25)
store double %26, double* %23
%27 = load double*, double** %4
%28 = getelementptr inbounds double, double* %27, i32 1
store double* %28, double** %4
%29 = load double, double* %27
%30 = load double*, double** %5
%31 = load double, double* %30
%32 = load double*, double** %7
%33 = getelementptr inbounds double, double* %32, i32 1
store double* %33, double** %7
%34 = load double, double* %32
%35 = call double @llvm.fmuladd.f64(double %29, double %31, double %34)
store double %35, double* %32
%36 = load double*, double** %4
%37 = getelementptr inbounds double, double* %36, i32 1
store double* %37, double** %4
%38 = load double, double* %36
%39 = load double*, double** %5
%40 = load double, double* %39
%41 = load double*, double** %7
%42 = getelementptr inbounds double, double* %41, i32 1
store double* %42, double** %7
%43 = load double, double* %41
%44 = call double @llvm.fmuladd.f64(double %38, double %40, double %43)
store double %44, double* %41
%45 = load double*, double** %4
%46 = getelementptr inbounds double, double* %45, i32 1
store double* %46, double** %4
%47 = load double, double* %45
%48 = load double*, double** %5
%49 = getelementptr inbounds double, double* %48, i32 1
store double* %49, double** %5
%50 = load double, double* %48
%51 = load double*, double** %7
%52 = getelementptr inbounds double, double* %51, i32 1
store double* %52, double** %7
%53 = load double, double* %51
%54 = call double @llvm.fmuladd.f64(double %47, double %50, double %53)
store double %54, double* %51
%55 = load double*, double** %6
store double* %55, double** %7
%56 = load double*, double** %4
%57 = getelementptr inbounds double, double* %56, i32 1
store double* %57, double** %4
%58 = load double, double* %56
%59 = load double*, double** %5
%60 = load double, double* %59
%61 = load double*, double** %7
%62 = getelementptr inbounds double, double* %61, i32 1
store double* %62, double** %7
%63 = load double, double* %61
%64 = call double @llvm.fmuladd.f64(double %58, double %60, double %63)
store double %64, double* %61
%65 = load double*, double** %4
%66 = getelementptr inbounds double, double* %65, i32 1
store double* %66, double** %4
%67 = load double, double* %65
%68 = load double*, double** %5
%69 = load double, double* %68
%70 = load double*, double** %7
%71 = getelementptr inbounds double, double* %70, i32 1
store double* %71, double** %7
%72 = load double, double* %70
%73 = call double @llvm.fmuladd.f64(double %67, double %69, double %72)
store double %73, double* %70
%74 = load double*, double** %4
%75 = getelementptr inbounds double, double* %74, i32 1
store double* %75, double** %4
%76 = load double, double* %74
%77 = load double*, double** %5
%78 = load double, double* %77
%79 = load double*, double** %7
%80 = getelementptr inbounds double, double* %79, i32 1
store double* %80, double** %7
%81 = load double, double* %79
%82 = call double @llvm.fmuladd.f64(double %76, double %78, double %81)
store double %82, double* %79
%83 = load double*, double** %4
%84 = getelementptr inbounds double, double* %83, i32 1
store double* %84, double** %4
%85 = load double, double* %83
%86 = load double*, double** %5
%87 = load double, double* %86
%88 = load double*, double** %7
%89 = getelementptr inbounds double, double* %88, i32 1
store double* %89, double** %7
%90 = load double, double* %88
%91 = call double @llvm.fmuladd.f64(double %85, double %87, double %90)
store double %91, double* %88
%92 = load double*, double** %4
%93 = getelementptr inbounds double, double* %92, i32 1
store double* %93, double** %4
%94 = load double, double* %92
%95 = load double*, double** %5
%96 = getelementptr inbounds double, double* %95, i32 1
store double* %96, double** %5
%97 = load double, double* %95
%98 = load double*, double** %7
%99 = getelementptr inbounds double, double* %98, i32 1
store double* %99, double** %7
%100 = load double, double* %98
%101 = call double @llvm.fmuladd.f64(double %94, double %97, double %100)
store double %101, double* %98
%102 = load double*, double** %6
store double* %102, double** %7
%103 = load double*, double** %4
%104 = getelementptr inbounds double, double* %103, i32 1
store double* %104, double** %4
%105 = load double, double* %103
%106 = load double*, double** %5
%107 = load double, double* %106
%108 = load double*, double** %7
%109 = getelementptr inbounds double, double* %108, i32 1
store double* %109, double** %7
%110 = load double, double* %108
%111 = call double @llvm.fmuladd.f64(double %105, double %107, double %110)
store double %111, double* %108
%112 = load double*, double** %4
%113 = getelementptr inbounds double, double* %112, i32 1
store double* %113, double** %4
%114 = load double, double* %112
%115 = load double*, double** %5
%116 = load double, double* %115
%117 = load double*, double** %7
%118 = getelementptr inbounds double, double* %117, i32 1
store double* %118, double** %7
%119 = load double, double* %117
%120 = call double @llvm.fmuladd.f64(double %114, double %116, double %119)
store double %120, double* %117
%121 = load double*, double** %4
%122 = getelementptr inbounds double, double* %121, i32 1
store double* %122, double** %4
%123 = load double, double* %121
%124 = load double*, double** %5
%125 = load double, double* %124
%126 = load double*, double** %7
%127 = getelementptr inbounds double, double* %126, i32 1
store double* %127, double** %7
%128 = load double, double* %126
%129 = call double @llvm.fmuladd.f64(double %123, double %125, double %128)
store double %129, double* %126
%130 = load double*, double** %4
%131 = getelementptr inbounds double, double* %130, i32 1
store double* %131, double** %4
%132 = load double, double* %130
%133 = load double*, double** %5
%134 = load double, double* %133
%135 = load double*, double** %7
%136 = getelementptr inbounds double, double* %135, i32 1
store double* %136, double** %7
%137 = load double, double* %135
%138 = call double @llvm.fmuladd.f64(double %132, double %134, double %137)
store double %138, double* %135
%139 = load double*, double** %4
%140 = getelementptr inbounds double, double* %139, i32 1
store double* %140, double** %4
%141 = load double, double* %139
%142 = load double*, double** %5
%143 = getelementptr inbounds double, double* %142, i32 1
store double* %143, double** %5
%144 = load double, double* %142
%145 = load double*, double** %7
%146 = getelementptr inbounds double, double* %145, i32 1
store double* %146, double** %7
%147 = load double, double* %145
%148 = call double @llvm.fmuladd.f64(double %141, double %144, double %147)
store double %148, double* %145
%149 = load double*, double** %6
store double* %149, double** %7
%150 = load double*, double** %4
%151 = getelementptr inbounds double, double* %150, i32 1
store double* %151, double** %4
%152 = load double, double* %150
%153 = load double*, double** %5
%154 = load double, double* %153
%155 = load double*, double** %7
%156 = getelementptr inbounds double, double* %155, i32 1
store double* %156, double** %7
%157 = load double, double* %155
%158 = call double @llvm.fmuladd.f64(double %152, double %154, double %157)
store double %158, double* %155
%159 = load double*, double** %4
%160 = getelementptr inbounds double, double* %159, i32 1
store double* %160, double** %4
%161 = load double, double* %159
%162 = load double*, double** %5
%163 = load double, double* %162
%164 = load double*, double** %7
%165 = getelementptr inbounds double, double* %164, i32 1
store double* %165, double** %7
%166 = load double, double* %164
%167 = call double @llvm.fmuladd.f64(double %161, double %163, double %166)
store double %167, double* %164
%168 = load double*, double** %4
%169 = getelementptr inbounds double, double* %168, i32 1
store double* %169, double** %4
%170 = load double, double* %168
%171 = load double*, double** %5
%172 = load double, double* %171
%173 = load double*, double** %7
%174 = getelementptr inbounds double, double* %173, i32 1
store double* %174, double** %7
%175 = load double, double* %173
%176 = call double @llvm.fmuladd.f64(double %170, double %172, double %175)
store double %176, double* %173
%177 = load double*, double** %4
%178 = getelementptr inbounds double, double* %177, i32 1
store double* %178, double** %4
%179 = load double, double* %177
%180 = load double*, double** %5
%181 = load double, double* %180
%182 = load double*, double** %7
%183 = getelementptr inbounds double, double* %182, i32 1
store double* %183, double** %7
%184 = load double, double* %182
%185 = call double @llvm.fmuladd.f64(double %179, double %181, double %184)
store double %185, double* %182
%186 = load double*, double** %4
%187 = getelementptr inbounds double, double* %186, i32 1
store double* %187, double** %4
%188 = load double, double* %186
%189 = load double*, double** %5
%190 = getelementptr inbounds double, double* %189, i32 1
store double* %190, double** %5
%191 = load double, double* %189
%192 = load double*, double** %7
%193 = getelementptr inbounds double, double* %192, i32 1
store double* %193, double** %7
%194 = load double, double* %192
%195 = call double @llvm.fmuladd.f64(double %188, double %191, double %194)
store double %195, double* %192
%196 = load double*, double** %6
store double* %196, double** %7
%197 = load double*, double** %4
%198 = getelementptr inbounds double, double* %197, i32 1
store double* %198, double** %4
%199 = load double, double* %197
%200 = load double*, double** %5
%201 = load double, double* %200
%202 = load double*, double** %7
%203 = getelementptr inbounds double, double* %202, i32 1
store double* %203, double** %7
%204 = load double, double* %202
%205 = call double @llvm.fmuladd.f64(double %199, double %201, double %204)
store double %205, double* %202
%206 = load double*, double** %4
%207 = getelementptr inbounds double, double* %206, i32 1
store double* %207, double** %4
%208 = load double, double* %206
%209 = load double*, double** %5
%210 = load double, double* %209
%211 = load double*, double** %7
%212 = getelementptr inbounds double, double* %211, i32 1
store double* %212, double** %7
%213 = load double, double* %211
%214 = call double @llvm.fmuladd.f64(double %208, double %210, double %213)
store double %214, double* %211
%215 = load double*, double** %4
%216 = getelementptr inbounds double, double* %215, i32 1
store double* %216, double** %4
%217 = load double, double* %215
%218 = load double*, double** %5
%219 = load double, double* %218
%220 = load double*, double** %7
%221 = getelementptr inbounds double, double* %220, i32 1
store double* %221, double** %7
%222 = load double, double* %220
%223 = call double @llvm.fmuladd.f64(double %217, double %219, double %222)
store double %223, double* %220
%224 = load double*, double** %4
%225 = getelementptr inbounds double, double* %224, i32 1
store double* %225, double** %4
%226 = load double, double* %224
%227 = load double*, double** %5
%228 = load double, double* %227
%229 = load double*, double** %7
%230 = getelementptr inbounds double, double* %229, i32 1
store double* %230, double** %7
%231 = load double, double* %229
%232 = call double @llvm.fmuladd.f64(double %226, double %228, double %231)
store double %232, double* %229
%233 = load double*, double** %4
%234 = getelementptr inbounds double, double* %233, i32 1
store double* %234, double** %4
%235 = load double, double* %233
%236 = load double*, double** %5
%237 = getelementptr inbounds double, double* %236, i32 1
store double* %237, double** %5
%238 = load double, double* %236
%239 = load double*, double** %7
%240 = getelementptr inbounds double, double* %239, i32 1
store double* %240, double** %7
%241 = load double, double* %239
%242 = call double @llvm.fmuladd.f64(double %235, double %238, double %241)
store double %242, double* %239
ret void
}

LLVM IR (-O2):
define void @mvp5x5(double* noalias %0, double* noalias nocapture %1, double* noalias nocapture %2) {
%4 = load double, double* %1
%5 = getelementptr inbounds double, double* %0, i64 2
%6 = bitcast double* %0 to <2 x double>*
%7 = load <2 x double>, <2 x double>* %6
%8 = getelementptr inbounds double, double* %2, i64 2
%9 = bitcast double* %2 to <2 x double>*
%10 = load <2 x double>, <2 x double>* %9
%11 = insertelement <2 x double> poison, double %4, i64 0
%12 = shufflevector <2 x double> %11, <2 x double> poison, <2 x i32> zeroinitializer
%13 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %7, <2 x double> %12, <2 x double> %10)
%14 = getelementptr inbounds double, double* %0, i64 4
%15 = bitcast double* %5 to <2 x double>*
%16 = load <2 x double>, <2 x double>* %15
%17 = getelementptr inbounds double, double* %2, i64 4
%18 = bitcast double* %8 to <2 x double>*
%19 = load <2 x double>, <2 x double>* %18
%20 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %16, <2 x double> %12, <2 x double> %19)
%21 = getelementptr inbounds double, double* %0, i64 5
%22 = load double, double* %14
%23 = getelementptr inbounds double, double* %1, i64 1
%24 = load double, double* %17
%25 = tail call double @llvm.fmuladd.f64(double %22, double %4, double %24)
%26 = load double, double* %23
%27 = getelementptr inbounds double, double* %0, i64 7
%28 = bitcast double* %21 to <2 x double>*
%29 = load <2 x double>, <2 x double>* %28
%30 = insertelement <2 x double> poison, double %26, i64 0
%31 = shufflevector <2 x double> %30, <2 x double> poison, <2 x i32> zeroinitializer
%32 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %29, <2 x double> %31, <2 x double> %13)
%33 = getelementptr inbounds double, double* %0, i64 9
%34 = bitcast double* %27 to <2 x double>*
%35 = load <2 x double>, <2 x double>* %34
%36 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %35, <2 x double> %31, <2 x double> %20)
%37 = getelementptr inbounds double, double* %0, i64 10
%38 = load double, double* %33
%39 = getelementptr inbounds double, double* %1, i64 2
%40 = tail call double @llvm.fmuladd.f64(double %38, double %26, double %25)
%41 = load double, double* %39
%42 = getelementptr inbounds double, double* %0, i64 12
%43 = bitcast double* %37 to <2 x double>*
%44 = load <2 x double>, <2 x double>* %43
%45 = insertelement <2 x double> poison, double %41, i64 0
%46 = shufflevector <2 x double> %45, <2 x double> poison, <2 x i32> zeroinitializer
%47 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %44, <2 x double> %46, <2 x double> %32)
%48 = getelementptr inbounds double, double* %0, i64 14
%49 = bitcast double* %42 to <2 x double>*
%50 = load <2 x double>, <2 x double>* %49
%51 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %50, <2 x double> %46, <2 x double> %36)
%52 = getelementptr inbounds double, double* %0, i64 15
%53 = load double, double* %48
%54 = getelementptr inbounds double, double* %1, i64 3
%55 = tail call double @llvm.fmuladd.f64(double %53, double %41, double %40)
%56 = load double, double* %54
%57 = getelementptr inbounds double, double* %0, i64 17
%58 = bitcast double* %52 to <2 x double>*
%59 = load <2 x double>, <2 x double>* %58
%60 = insertelement <2 x double> poison, double %56, i64 0
%61 = shufflevector <2 x double> %60, <2 x double> poison, <2 x i32> zeroinitializer
%62 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %59, <2 x double> %61, <2 x double> %47)
%63 = getelementptr inbounds double, double* %0, i64 19
%64 = bitcast double* %57 to <2 x double>*
%65 = load <2 x double>, <2 x double>* %64
%66 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %65, <2 x double> %61, <2 x double> %51)
%67 = getelementptr inbounds double, double* %0, i64 20
%68 = load double, double* %63
%69 = getelementptr inbounds double, double* %1, i64 4
%70 = tail call double @llvm.fmuladd.f64(double %68, double %56, double %55)
%71 = load double, double* %69
%72 = getelementptr inbounds double, double* %0, i64 22
%73 = bitcast double* %67 to <2 x double>*
%74 = load <2 x double>, <2 x double>* %73
%75 = insertelement <2 x double> poison, double %71, i64 0
%76 = shufflevector <2 x double> %75, <2 x double> poison, <2 x i32> zeroinitializer
%77 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %74, <2 x double> %76, <2 x double> %62)
%78 = bitcast double* %2 to <2 x double>*
store <2 x double> %77, <2 x double>* %78
%79 = getelementptr inbounds double, double* %0, i64 24
%80 = bitcast double* %72 to <2 x double>*
%81 = load <2 x double>, <2 x double>* %80
%82 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %81, <2 x double> %76, <2 x double> %66)
%83 = bitcast double* %8 to <2 x double>*
store <2 x double> %82, <2 x double>* %83
%84 = load double, double* %79
%85 = tail call double @llvm.fmuladd.f64(double %84, double %71, double %70)
store double %85, double* %17
ret void
}