float mat4_determinant(float *dst) {
  float a00 = dst[0], a01 = dst[1], a02 = dst[2], a03 = dst[3];
  float a10 = dst[4], a11 = dst[5], a12 = dst[6], a13 = dst[7];
  float a20 = dst[8], a21 = dst[9], a22 = dst[10], a23 = dst[11];
  float a30 = dst[12], a31 = dst[13], a32 = dst[14], a33 = dst[15];
  float b00 = a00 * a11 - a01 * a10;
  float b01 = a00 * a12 - a02 * a10;
  float b02 = a00 * a13 - a03 * a10;
  float b03 = a01 * a12 - a02 * a11;
  float b04 = a01 * a13 - a03 * a11;
  float b05 = a02 * a13 - a03 * a12;
  float b06 = a20 * a31 - a21 * a30;
  float b07 = a20 * a32 - a22 * a30;
  float b08 = a20 * a33 - a23 * a30;
  float b09 = a21 * a32 - a22 * a31;
  float b10 = a21 * a33 - a23 * a31;
  float b11 = a22 * a33 - a23 * a32;
  return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
}


x86 assembly (clang, -O0):
<mat4_determinant>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0xc(%rbp)
mov    -0x8(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movss  0x10(%rax),%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movss  0x14(%rax),%xmm0
movss  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movss  0x18(%rax),%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movss  0x1c(%rax),%xmm0
movss  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movss  0x20(%rax),%xmm0
movss  %xmm0,-0x2c(%rbp)
mov    -0x8(%rbp),%rax
movss  0x24(%rax),%xmm0
movss  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movss  0x28(%rax),%xmm0
movss  %xmm0,-0x34(%rbp)
mov    -0x8(%rbp),%rax
movss  0x2c(%rax),%xmm0
movss  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movss  0x30(%rax),%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x8(%rbp),%rax
movss  0x34(%rax),%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x8(%rbp),%rax
movss  0x38(%rax),%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x8(%rbp),%rax
movss  0x3c(%rax),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0xc(%rbp),%xmm0
movss  -0x20(%rbp),%xmm2
movss  -0x10(%rbp),%xmm1
mulss  -0x1c(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0xc(%rbp),%xmm0
movss  -0x24(%rbp),%xmm2
movss  -0x14(%rbp),%xmm1
mulss  -0x1c(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x50(%rbp)
movss  -0xc(%rbp),%xmm0
movss  -0x28(%rbp),%xmm2
movss  -0x18(%rbp),%xmm1
mulss  -0x1c(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x54(%rbp)
movss  -0x10(%rbp),%xmm0
movss  -0x24(%rbp),%xmm2
movss  -0x14(%rbp),%xmm1
mulss  -0x20(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x10(%rbp),%xmm0
movss  -0x28(%rbp),%xmm2
movss  -0x18(%rbp),%xmm1
mulss  -0x20(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x5c(%rbp)
movss  -0x14(%rbp),%xmm0
movss  -0x28(%rbp),%xmm2
movss  -0x18(%rbp),%xmm1
mulss  -0x24(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x60(%rbp)
movss  -0x2c(%rbp),%xmm0
movss  -0x40(%rbp),%xmm2
movss  -0x30(%rbp),%xmm1
mulss  -0x3c(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x64(%rbp)
movss  -0x2c(%rbp),%xmm0
movss  -0x44(%rbp),%xmm2
movss  -0x34(%rbp),%xmm1
mulss  -0x3c(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x68(%rbp)
movss  -0x2c(%rbp),%xmm0
movss  -0x48(%rbp),%xmm2
movss  -0x38(%rbp),%xmm1
mulss  -0x3c(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x6c(%rbp)
movss  -0x30(%rbp),%xmm0
movss  -0x44(%rbp),%xmm2
movss  -0x34(%rbp),%xmm1
mulss  -0x40(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x70(%rbp)
movss  -0x30(%rbp),%xmm0
movss  -0x48(%rbp),%xmm2
movss  -0x38(%rbp),%xmm1
mulss  -0x40(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x74(%rbp)
movss  -0x34(%rbp),%xmm0
movss  -0x48(%rbp),%xmm2
movss  -0x38(%rbp),%xmm1
mulss  -0x44(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x78(%rbp)
movss  -0x4c(%rbp),%xmm0
movss  -0x78(%rbp),%xmm2
movss  -0x50(%rbp),%xmm1
mulss  -0x74(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  -0x54(%rbp),%xmm1
movss  -0x70(%rbp),%xmm2
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
movss  -0x58(%rbp),%xmm0
movss  -0x6c(%rbp),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  -0x5c(%rbp),%xmm1
movss  -0x68(%rbp),%xmm2
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
movss  -0x60(%rbp),%xmm0
movss  -0x64(%rbp),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<mat4_determinant>:
movss  (%rdi),%xmm10
movss  0x4(%rdi),%xmm5
movss  0x8(%rdi),%xmm7
movss  0xc(%rdi),%xmm12
movss  0x10(%rdi),%xmm4
movss  0x14(%rdi),%xmm3
movss  0x18(%rdi),%xmm1
movss  0x1c(%rdi),%xmm11
movss  0x20(%rdi),%xmm13
movss  0x24(%rdi),%xmm14
movss  0x28(%rdi),%xmm0
movaps %xmm4,%xmm6
mulss  %xmm5,%xmm6
movaps %xmm10,%xmm8
mulss  %xmm3,%xmm8
subss  %xmm6,%xmm8
movaps %xmm4,%xmm6
mulss  %xmm7,%xmm6
movaps %xmm10,%xmm9
mulss  %xmm1,%xmm9
subss  %xmm6,%xmm9
mulss  %xmm12,%xmm4
mulss  %xmm11,%xmm10
subss  %xmm4,%xmm10
movaps %xmm3,%xmm4
mulss  %xmm7,%xmm4
movaps %xmm5,%xmm6
mulss  %xmm1,%xmm6
subss  %xmm4,%xmm6
movss  0x30(%rdi),%xmm2
mulss  %xmm12,%xmm3
mulss  %xmm11,%xmm5
subss  %xmm3,%xmm5
movss  0x34(%rdi),%xmm3
mulss  %xmm12,%xmm1
movss  0x38(%rdi),%xmm12
mulss  %xmm11,%xmm7
subss  %xmm1,%xmm7
movaps %xmm2,%xmm4
mulss  %xmm14,%xmm4
movaps %xmm13,%xmm1
mulss  %xmm3,%xmm1
subss  %xmm4,%xmm1
mulss  %xmm7,%xmm1
movaps %xmm2,%xmm4
mulss  %xmm0,%xmm4
movaps %xmm13,%xmm7
mulss  %xmm12,%xmm7
subss  %xmm4,%xmm7
movss  0x2c(%rdi),%xmm4
mulss  %xmm5,%xmm7
movss  0x3c(%rdi),%xmm5
mulss  %xmm4,%xmm2
mulss  %xmm5,%xmm13
subss  %xmm2,%xmm13
mulss  %xmm6,%xmm13
movaps %xmm3,%xmm2
mulss  %xmm0,%xmm2
movaps %xmm14,%xmm6
mulss  %xmm12,%xmm6
subss  %xmm2,%xmm6
mulss  %xmm10,%xmm6
mulss  %xmm4,%xmm3
mulss  %xmm5,%xmm14
subss  %xmm3,%xmm14
mulss  %xmm9,%xmm14
mulss  %xmm4,%xmm12
mulss  %xmm5,%xmm0
subss  %xmm12,%xmm0
mulss  %xmm8,%xmm0
subss  %xmm14,%xmm0
addss  %xmm6,%xmm0
addss  %xmm13,%xmm0
subss  %xmm7,%xmm0
addss  %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @mat4_determinant(float* %0) {
%2 = alloca float*
%3 = alloca float
%4 = alloca float
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float
%12 = alloca float
%13 = alloca float
%14 = alloca float
%15 = alloca float
%16 = alloca float
%17 = alloca float
%18 = alloca float
%19 = alloca float
%20 = alloca float
%21 = alloca float
%22 = alloca float
%23 = alloca float
%24 = alloca float
%25 = alloca float
%26 = alloca float
%27 = alloca float
%28 = alloca float
%29 = alloca float
%30 = alloca float
store float* %0, float** %2
%31 = load float*, float** %2
%32 = getelementptr inbounds float, float* %31, i64 0
%33 = load float, float* %32
store float %33, float* %3
%34 = load float*, float** %2
%35 = getelementptr inbounds float, float* %34, i64 1
%36 = load float, float* %35
store float %36, float* %4
%37 = load float*, float** %2
%38 = getelementptr inbounds float, float* %37, i64 2
%39 = load float, float* %38
store float %39, float* %5
%40 = load float*, float** %2
%41 = getelementptr inbounds float, float* %40, i64 3
%42 = load float, float* %41
store float %42, float* %6
%43 = load float*, float** %2
%44 = getelementptr inbounds float, float* %43, i64 4
%45 = load float, float* %44
store float %45, float* %7
%46 = load float*, float** %2
%47 = getelementptr inbounds float, float* %46, i64 5
%48 = load float, float* %47
store float %48, float* %8
%49 = load float*, float** %2
%50 = getelementptr inbounds float, float* %49, i64 6
%51 = load float, float* %50
store float %51, float* %9
%52 = load float*, float** %2
%53 = getelementptr inbounds float, float* %52, i64 7
%54 = load float, float* %53
store float %54, float* %10
%55 = load float*, float** %2
%56 = getelementptr inbounds float, float* %55, i64 8
%57 = load float, float* %56
store float %57, float* %11
%58 = load float*, float** %2
%59 = getelementptr inbounds float, float* %58, i64 9
%60 = load float, float* %59
store float %60, float* %12
%61 = load float*, float** %2
%62 = getelementptr inbounds float, float* %61, i64 10
%63 = load float, float* %62
store float %63, float* %13
%64 = load float*, float** %2
%65 = getelementptr inbounds float, float* %64, i64 11
%66 = load float, float* %65
store float %66, float* %14
%67 = load float*, float** %2
%68 = getelementptr inbounds float, float* %67, i64 12
%69 = load float, float* %68
store float %69, float* %15
%70 = load float*, float** %2
%71 = getelementptr inbounds float, float* %70, i64 13
%72 = load float, float* %71
store float %72, float* %16
%73 = load float*, float** %2
%74 = getelementptr inbounds float, float* %73, i64 14
%75 = load float, float* %74
store float %75, float* %17
%76 = load float*, float** %2
%77 = getelementptr inbounds float, float* %76, i64 15
%78 = load float, float* %77
store float %78, float* %18
%79 = load float, float* %3
%80 = load float, float* %8
%81 = load float, float* %4
%82 = load float, float* %7
%83 = fmul float %81, %82
%84 = fneg float %83
%85 = call float @llvm.fmuladd.f32(float %79, float %80, float %84)
store float %85, float* %19
%86 = load float, float* %3
%87 = load float, float* %9
%88 = load float, float* %5
%89 = load float, float* %7
%90 = fmul float %88, %89
%91 = fneg float %90
%92 = call float @llvm.fmuladd.f32(float %86, float %87, float %91)
store float %92, float* %20
%93 = load float, float* %3
%94 = load float, float* %10
%95 = load float, float* %6
%96 = load float, float* %7
%97 = fmul float %95, %96
%98 = fneg float %97
%99 = call float @llvm.fmuladd.f32(float %93, float %94, float %98)
store float %99, float* %21
%100 = load float, float* %4
%101 = load float, float* %9
%102 = load float, float* %5
%103 = load float, float* %8
%104 = fmul float %102, %103
%105 = fneg float %104
%106 = call float @llvm.fmuladd.f32(float %100, float %101, float %105)
store float %106, float* %22
%107 = load float, float* %4
%108 = load float, float* %10
%109 = load float, float* %6
%110 = load float, float* %8
%111 = fmul float %109, %110
%112 = fneg float %111
%113 = call float @llvm.fmuladd.f32(float %107, float %108, float %112)
store float %113, float* %23
%114 = load float, float* %5
%115 = load float, float* %10
%116 = load float, float* %6
%117 = load float, float* %9
%118 = fmul float %116, %117
%119 = fneg float %118
%120 = call float @llvm.fmuladd.f32(float %114, float %115, float %119)
store float %120, float* %24
%121 = load float, float* %11
%122 = load float, float* %16
%123 = load float, float* %12
%124 = load float, float* %15
%125 = fmul float %123, %124
%126 = fneg float %125
%127 = call float @llvm.fmuladd.f32(float %121, float %122, float %126)
store float %127, float* %25
%128 = load float, float* %11
%129 = load float, float* %17
%130 = load float, float* %13
%131 = load float, float* %15
%132 = fmul float %130, %131
%133 = fneg float %132
%134 = call float @llvm.fmuladd.f32(float %128, float %129, float %133)
store float %134, float* %26
%135 = load float, float* %11
%136 = load float, float* %18
%137 = load float, float* %14
%138 = load float, float* %15
%139 = fmul float %137, %138
%140 = fneg float %139
%141 = call float @llvm.fmuladd.f32(float %135, float %136, float %140)
store float %141, float* %27
%142 = load float, float* %12
%143 = load float, float* %17
%144 = load float, float* %13
%145 = load float, float* %16
%146 = fmul float %144, %145
%147 = fneg float %146
%148 = call float @llvm.fmuladd.f32(float %142, float %143, float %147)
store float %148, float* %28
%149 = load float, float* %12
%150 = load float, float* %18
%151 = load float, float* %14
%152 = load float, float* %16
%153 = fmul float %151, %152
%154 = fneg float %153
%155 = call float @llvm.fmuladd.f32(float %149, float %150, float %154)
store float %155, float* %29
%156 = load float, float* %13
%157 = load float, float* %18
%158 = load float, float* %14
%159 = load float, float* %17
%160 = fmul float %158, %159
%161 = fneg float %160
%162 = call float @llvm.fmuladd.f32(float %156, float %157, float %161)
store float %162, float* %30
%163 = load float, float* %19
%164 = load float, float* %30
%165 = load float, float* %20
%166 = load float, float* %29
%167 = fmul float %165, %166
%168 = fneg float %167
%169 = call float @llvm.fmuladd.f32(float %163, float %164, float %168)
%170 = load float, float* %21
%171 = load float, float* %28
%172 = call float @llvm.fmuladd.f32(float %170, float %171, float %169)
%173 = load float, float* %22
%174 = load float, float* %27
%175 = call float @llvm.fmuladd.f32(float %173, float %174, float %172)
%176 = load float, float* %23
%177 = load float, float* %26
%178 = fneg float %176
%179 = call float @llvm.fmuladd.f32(float %178, float %177, float %175)
%180 = load float, float* %24
%181 = load float, float* %25
%182 = call float @llvm.fmuladd.f32(float %180, float %181, float %179)
ret float %182
}

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