#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double det3(double, double, double, double, double, double, double, double,
            double);
double det4(double a11, double a12, double a13, double a14, double a21,
            double a22, double a23, double a24, double a31, double a32,
            double a33, double a34, double a41, double a42, double a43,
            double a44) {
  return a11 * det3(a22, a23, a24, a32, a33, a34, a42, a43, a44) -
         a12 * det3(a21, a23, a24, a31, a33, a34, a41, a43, a44) +
         a13 * det3(a21, a22, a24, a31, a32, a34, a41, a42, a44) -
         a14 * det3(a21, a22, a23, a31, a32, a33, a41, a42, a43);
}


x86 assembly (clang, -O0):
<det4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
movsd  0x48(%rbp),%xmm8
movsd  0x40(%rbp),%xmm8
movsd  0x38(%rbp),%xmm8
movsd  0x30(%rbp),%xmm8
movsd  0x28(%rbp),%xmm8
movsd  0x20(%rbp),%xmm8
movsd  0x18(%rbp),%xmm8
movsd  0x10(%rbp),%xmm8
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
movsd  %xmm4,-0x28(%rbp)
movsd  %xmm5,-0x30(%rbp)
movsd  %xmm6,-0x38(%rbp)
movsd  %xmm7,-0x40(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm2
movsd  0x18(%rbp),%xmm3
movsd  0x20(%rbp),%xmm4
movsd  0x28(%rbp),%xmm5
movsd  0x38(%rbp),%xmm6
movsd  0x40(%rbp),%xmm7
movsd  0x48(%rbp),%xmm8
movsd  %xmm8,(%rsp)
call   1030 <det3@plt>
movsd  %xmm0,-0x70(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm2
movsd  0x10(%rbp),%xmm3
movsd  0x20(%rbp),%xmm4
movsd  0x28(%rbp),%xmm5
movsd  0x30(%rbp),%xmm6
movsd  0x40(%rbp),%xmm7
movsd  0x48(%rbp),%xmm8
movsd  %xmm8,(%rsp)
call   1030 <det3@plt>
movsd  -0x78(%rbp),%xmm1
movsd  -0x70(%rbp),%xmm2
movaps %xmm0,%xmm3
movsd  -0x68(%rbp),%xmm0
mulsd  %xmm3,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm2
movsd  0x10(%rbp),%xmm3
movsd  0x18(%rbp),%xmm4
movsd  0x28(%rbp),%xmm5
movsd  0x30(%rbp),%xmm6
movsd  0x38(%rbp),%xmm7
movsd  0x48(%rbp),%xmm8
movsd  %xmm8,(%rsp)
call   1030 <det3@plt>
movsd  -0x60(%rbp),%xmm1
movaps %xmm0,%xmm2
movsd  -0x58(%rbp),%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm2
movsd  0x10(%rbp),%xmm3
movsd  0x18(%rbp),%xmm4
movsd  0x20(%rbp),%xmm5
movsd  0x30(%rbp),%xmm6
movsd  0x38(%rbp),%xmm7
movsd  0x40(%rbp),%xmm8
movsd  %xmm8,(%rsp)
call   1030 <det3@plt>
movsd  -0x50(%rbp),%xmm1
movaps %xmm0,%xmm2
movsd  -0x48(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<det4>:
sub    $0x58,%rsp
movaps %xmm7,%xmm9
movsd  %xmm7,0x20(%rsp)
movaps %xmm6,%xmm8
movsd  %xmm6,0x30(%rsp)
movaps %xmm5,%xmm10
movsd  %xmm5,0x28(%rsp)
movsd  %xmm4,0x18(%rsp)
movsd  %xmm3,0x50(%rsp)
movsd  %xmm2,0x48(%rsp)
movsd  %xmm1,0x38(%rsp)
movsd  %xmm0,0x40(%rsp)
movsd  0x68(%rsp),%xmm3
movsd  0x70(%rsp),%xmm4
movsd  0x78(%rsp),%xmm5
movsd  0x88(%rsp),%xmm6
movsd  0x90(%rsp),%xmm7
movsd  0x98(%rsp),%xmm0
movsd  %xmm0,(%rsp)
movaps %xmm10,%xmm0
movaps %xmm8,%xmm1
movaps %xmm9,%xmm2
call   1030 <det3@plt>
movsd  %xmm0,0x10(%rsp)
movsd  0x98(%rsp),%xmm0
movsd  %xmm0,(%rsp)
movsd  0x18(%rsp),%xmm0
movsd  0x30(%rsp),%xmm1
movsd  0x20(%rsp),%xmm2
movsd  0x60(%rsp),%xmm3
movsd  0x70(%rsp),%xmm4
movsd  0x78(%rsp),%xmm5
movsd  0x80(%rsp),%xmm6
movsd  0x90(%rsp),%xmm7
call   1030 <det3@plt>
mulsd  0x38(%rsp),%xmm0
movsd  0x10(%rsp),%xmm1
mulsd  0x40(%rsp),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,0x10(%rsp)
movsd  0x98(%rsp),%xmm0
movsd  %xmm0,(%rsp)
movsd  0x18(%rsp),%xmm0
movsd  0x28(%rsp),%xmm1
movsd  0x20(%rsp),%xmm2
movsd  0x60(%rsp),%xmm3
movsd  0x68(%rsp),%xmm4
movsd  0x78(%rsp),%xmm5
movsd  0x80(%rsp),%xmm6
movsd  0x88(%rsp),%xmm7
call   1030 <det3@plt>
mulsd  0x48(%rsp),%xmm0
addsd  0x10(%rsp),%xmm0
movsd  %xmm0,0x10(%rsp)
movsd  0x90(%rsp),%xmm0
movsd  %xmm0,(%rsp)
movsd  0x18(%rsp),%xmm0
movsd  0x28(%rsp),%xmm1
movsd  0x30(%rsp),%xmm2
movsd  0x60(%rsp),%xmm3
movsd  0x68(%rsp),%xmm4
movsd  0x70(%rsp),%xmm5
movsd  0x80(%rsp),%xmm6
movsd  0x88(%rsp),%xmm7
call   1030 <det3@plt>
mulsd  0x50(%rsp),%xmm0
movsd  0x10(%rsp),%xmm1
subsd  %xmm0,%xmm1
movapd %xmm1,%xmm0
add    $0x58,%rsp
ret

LLVM IR (-O0):
define double @det4(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9, double %10, double %11, double %12, double %13, double %14, double %15) {
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
%24 = alloca double
%25 = alloca double
%26 = alloca double
%27 = alloca double
%28 = alloca double
%29 = alloca double
%30 = alloca double
%31 = alloca double
%32 = alloca double
store double %0, double* %17
store double %1, double* %18
store double %2, double* %19
store double %3, double* %20
store double %4, double* %21
store double %5, double* %22
store double %6, double* %23
store double %7, double* %24
store double %8, double* %25
store double %9, double* %26
store double %10, double* %27
store double %11, double* %28
store double %12, double* %29
store double %13, double* %30
store double %14, double* %31
store double %15, double* %32
%33 = load double, double* %17
%34 = load double, double* %22
%35 = load double, double* %23
%36 = load double, double* %24
%37 = load double, double* %26
%38 = load double, double* %27
%39 = load double, double* %28
%40 = load double, double* %30
%41 = load double, double* %31
%42 = load double, double* %32
%43 = call double @det3(double %34, double %35, double %36, double %37, double %38, double %39, double %40, double %41, double %42)
%44 = load double, double* %18
%45 = load double, double* %21
%46 = load double, double* %23
%47 = load double, double* %24
%48 = load double, double* %25
%49 = load double, double* %27
%50 = load double, double* %28
%51 = load double, double* %29
%52 = load double, double* %31
%53 = load double, double* %32
%54 = call double @det3(double %45, double %46, double %47, double %48, double %49, double %50, double %51, double %52, double %53)
%55 = fmul double %44, %54
%56 = fneg double %55
%57 = call double @llvm.fmuladd.f64(double %33, double %43, double %56)
%58 = load double, double* %19
%59 = load double, double* %21
%60 = load double, double* %22
%61 = load double, double* %24
%62 = load double, double* %25
%63 = load double, double* %26
%64 = load double, double* %28
%65 = load double, double* %29
%66 = load double, double* %30
%67 = load double, double* %32
%68 = call double @det3(double %59, double %60, double %61, double %62, double %63, double %64, double %65, double %66, double %67)
%69 = call double @llvm.fmuladd.f64(double %58, double %68, double %57)
%70 = load double, double* %20
%71 = load double, double* %21
%72 = load double, double* %22
%73 = load double, double* %23
%74 = load double, double* %25
%75 = load double, double* %26
%76 = load double, double* %27
%77 = load double, double* %29
%78 = load double, double* %30
%79 = load double, double* %31
%80 = call double @det3(double %71, double %72, double %73, double %74, double %75, double %76, double %77, double %78, double %79)
%81 = fneg double %70
%82 = call double @llvm.fmuladd.f64(double %81, double %80, double %69)
ret double %82
}

LLVM IR (-O2):
define double @det4(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9, double %10, double %11, double %12, double %13, double %14, double %15) {
%17 = tail call double @det3(double %5, double %6, double %7, double %9, double %10, double %11, double %13, double %14, double %15)
%18 = tail call double @det3(double %4, double %6, double %7, double %8, double %10, double %11, double %12, double %14, double %15)
%19 = fneg double %18
%20 = fmul double %19, %1
%21 = tail call double @llvm.fmuladd.f64(double %0, double %17, double %20)
%22 = tail call double @det3(double %4, double %5, double %7, double %8, double %9, double %11, double %12, double %13, double %15)
%23 = tail call double @llvm.fmuladd.f64(double %2, double %22, double %21)
%24 = tail call double @det3(double %4, double %5, double %6, double %8, double %9, double %10, double %12, double %13, double %14)
%25 = fneg double %3
%26 = tail call double @llvm.fmuladd.f64(double %25, double %24, double %23)
ret double %26
}