float get_3x3_determinant(const float *m) {
  return (m[0] * ((m[4] * m[8]) - (m[7] * m[5]))) -
         (m[1] * ((m[3] * m[8]) - (m[6] * m[5]))) +
         (m[2] * ((m[3] * m[7]) - (m[6] * m[4])));
}


x86 assembly (clang, -O0):
<get_3x3_determinant>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm1
mov    -0x8(%rbp),%rax
movss  0x10(%rax),%xmm2
mov    -0x8(%rbp),%rax
movss  0x20(%rax),%xmm3
mov    -0x8(%rbp),%rax
movss  0x1c(%rax),%xmm0
mov    -0x8(%rbp),%rax
mulss  0x14(%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm3,%xmm2
addss  %xmm0,%xmm2
mov    -0x8(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  0xc(%rax),%xmm3
mov    -0x8(%rbp),%rax
movss  0x20(%rax),%xmm5
mov    -0x8(%rbp),%rax
movss  0x18(%rax),%xmm4
mov    -0x8(%rbp),%rax
mulss  0x14(%rax),%xmm4
movd   %xmm4,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm4
mulss  %xmm5,%xmm3
addss  %xmm4,%xmm3
mulss  %xmm3,%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  0xc(%rax),%xmm2
mov    -0x8(%rbp),%rax
movss  0x1c(%rax),%xmm4
mov    -0x8(%rbp),%rax
movss  0x18(%rax),%xmm3
mov    -0x8(%rbp),%rax
mulss  0x10(%rax),%xmm3
movd   %xmm3,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm3
mulss  %xmm4,%xmm2
addss  %xmm3,%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_3x3_determinant>:
movss  0xc(%rdi),%xmm0
movss  0x10(%rdi),%xmm1
movss  0x20(%rdi),%xmm2
movss  0x1c(%rdi),%xmm3
movss  0x14(%rdi),%xmm4
movaps %xmm4,%xmm5
mulss  %xmm3,%xmm5
movaps %xmm1,%xmm6
mulss  %xmm2,%xmm6
subss  %xmm5,%xmm6
movss  0x18(%rdi),%xmm5
mulss  %xmm5,%xmm4
mulss  %xmm0,%xmm2
subss  %xmm4,%xmm2
mulss  0x4(%rdi),%xmm2
mulss  (%rdi),%xmm6
subss  %xmm2,%xmm6
mulss  %xmm5,%xmm1
mulss  %xmm3,%xmm0
subss  %xmm1,%xmm0
mulss  0x8(%rdi),%xmm0
addss  %xmm6,%xmm0
ret

LLVM IR (-O0):
define float @get_3x3_determinant(float* %0) {
%2 = alloca float*
store float* %0, float** %2
%3 = load float*, float** %2
%4 = getelementptr inbounds float, float* %3, i64 0
%5 = load float, float* %4
%6 = load float*, float** %2
%7 = getelementptr inbounds float, float* %6, i64 4
%8 = load float, float* %7
%9 = load float*, float** %2
%10 = getelementptr inbounds float, float* %9, i64 8
%11 = load float, float* %10
%12 = load float*, float** %2
%13 = getelementptr inbounds float, float* %12, i64 7
%14 = load float, float* %13
%15 = load float*, float** %2
%16 = getelementptr inbounds float, float* %15, i64 5
%17 = load float, float* %16
%18 = fmul float %14, %17
%19 = fneg float %18
%20 = call float @llvm.fmuladd.f32(float %8, float %11, float %19)
%21 = load float*, float** %2
%22 = getelementptr inbounds float, float* %21, i64 1
%23 = load float, float* %22
%24 = load float*, float** %2
%25 = getelementptr inbounds float, float* %24, i64 3
%26 = load float, float* %25
%27 = load float*, float** %2
%28 = getelementptr inbounds float, float* %27, i64 8
%29 = load float, float* %28
%30 = load float*, float** %2
%31 = getelementptr inbounds float, float* %30, i64 6
%32 = load float, float* %31
%33 = load float*, float** %2
%34 = getelementptr inbounds float, float* %33, i64 5
%35 = load float, float* %34
%36 = fmul float %32, %35
%37 = fneg float %36
%38 = call float @llvm.fmuladd.f32(float %26, float %29, float %37)
%39 = fmul float %23, %38
%40 = fneg float %39
%41 = call float @llvm.fmuladd.f32(float %5, float %20, float %40)
%42 = load float*, float** %2
%43 = getelementptr inbounds float, float* %42, i64 2
%44 = load float, float* %43
%45 = load float*, float** %2
%46 = getelementptr inbounds float, float* %45, i64 3
%47 = load float, float* %46
%48 = load float*, float** %2
%49 = getelementptr inbounds float, float* %48, i64 7
%50 = load float, float* %49
%51 = load float*, float** %2
%52 = getelementptr inbounds float, float* %51, i64 6
%53 = load float, float* %52
%54 = load float*, float** %2
%55 = getelementptr inbounds float, float* %54, i64 4
%56 = load float, float* %55
%57 = fmul float %53, %56
%58 = fneg float %57
%59 = call float @llvm.fmuladd.f32(float %47, float %50, float %58)
%60 = call float @llvm.fmuladd.f32(float %44, float %59, float %41)
ret float %60
}

LLVM IR (-O2):
define float @get_3x3_determinant(float* nocapture %0) {
%2 = load float, float* %0
%3 = getelementptr inbounds float, float* %0, i64 4
%4 = load float, float* %3
%5 = getelementptr inbounds float, float* %0, i64 8
%6 = load float, float* %5
%7 = getelementptr inbounds float, float* %0, i64 7
%8 = load float, float* %7
%9 = getelementptr inbounds float, float* %0, i64 5
%10 = load float, float* %9
%11 = fneg float %8
%12 = fmul float %10, %11
%13 = tail call float @llvm.fmuladd.f32(float %4, float %6, float %12)
%14 = getelementptr inbounds float, float* %0, i64 1
%15 = load float, float* %14
%16 = getelementptr inbounds float, float* %0, i64 3
%17 = load float, float* %16
%18 = getelementptr inbounds float, float* %0, i64 6
%19 = load float, float* %18
%20 = fneg float %19
%21 = fmul float %10, %20
%22 = tail call float @llvm.fmuladd.f32(float %17, float %6, float %21)
%23 = fneg float %15
%24 = fmul float %22, %23
%25 = tail call float @llvm.fmuladd.f32(float %2, float %13, float %24)
%26 = getelementptr inbounds float, float* %0, i64 2
%27 = load float, float* %26
%28 = fmul float %4, %20
%29 = tail call float @llvm.fmuladd.f32(float %17, float %8, float %28)
%30 = tail call float @llvm.fmuladd.f32(float %27, float %29, float %25)
ret float %30
}