long double lldet4(long double a, long double b, long double c, long double d,
                   long double e, long double f, long double g, long double h,
                   long double i, long double j, long double k, long double l,
                   long double m, long double n, long double o, long double p) {
  return (a * f - b * e) * (k * p - l * o) + (a * g - c * e) * (l * n - j * p) +
         (a * h - d * e) * (j * o - k * n) + (c * f - b * g) * (l * m - i * p) +
         (b * h - d * f) * (k * m - i * o) + (c * h - d * g) * (i * n - k * m);
}


x86 assembly (clang, -O0):
<lldet4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x1d0,%rsp
fldt   0x100(%rbp)
fstpt  -0x1f0(%rbp)
fldt   0xf0(%rbp)
fldt   0xe0(%rbp)
fldt   0xd0(%rbp)
fldt   0xc0(%rbp)
fldt   0xb0(%rbp)
fldt   0xa0(%rbp)
fldt   0x90(%rbp)
fstpt  -0x1fc(%rbp)
fldt   0x80(%rbp)
fstpt  -0x208(%rbp)
fldt   0x70(%rbp)
fstpt  -0x214(%rbp)
fldt   0x60(%rbp)
fstpt  -0x220(%rbp)
fldt   0x50(%rbp)
fstpt  -0x22c(%rbp)
fldt   0x40(%rbp)
fstpt  -0x238(%rbp)
fldt   0x30(%rbp)
fstpt  -0x244(%rbp)
fldt   0x20(%rbp)
fstpt  -0x250(%rbp)
fldt   0x10(%rbp)
fstpt  -0x10(%rbp)
fldt   -0x250(%rbp)
fstpt  -0x20(%rbp)
fldt   -0x244(%rbp)
fstpt  -0x30(%rbp)
fldt   -0x238(%rbp)
fstpt  -0x40(%rbp)
fldt   -0x22c(%rbp)
fstpt  -0x50(%rbp)
fldt   -0x220(%rbp)
fstpt  -0x60(%rbp)
fldt   -0x214(%rbp)
fstpt  -0x70(%rbp)
fldt   -0x208(%rbp)
fstpt  -0x80(%rbp)
fldt   -0x1fc(%rbp)
fstpt  -0x90(%rbp)
fldt   -0x1f0(%rbp)
fxch   %st(1)
fstpt  -0xa0(%rbp)
fxch   %st(1)
fstpt  -0xb0(%rbp)
fxch   %st(1)
fstpt  -0xc0(%rbp)
fxch   %st(1)
fstpt  -0xd0(%rbp)
fxch   %st(1)
fstpt  -0xe0(%rbp)
fxch   %st(1)
fstpt  -0xf0(%rbp)
fstpt  -0x100(%rbp)
fldt   -0x10(%rbp)
fld    %st(0)
fstpt  -0x1d8(%rbp)
fldt   -0x60(%rbp)
fld    %st(0)
fstpt  -0x154(%rbp)
fldt   -0x20(%rbp)
fld    %st(0)
fstpt  -0x160(%rbp)
fldt   -0x50(%rbp)
fld    %st(0)
fstpt  -0x1e4(%rbp)
fmul   %st,%st(1)
fxch   %st(2)
fmul   %st(3),%st
fsubp  %st,%st(1)
fldt   -0xb0(%rbp)
fldt   -0x100(%rbp)
fld    %st(0)
fstpt  -0x190(%rbp)
fldt   -0xc0(%rbp)
fld    %st(0)
fstpt  -0x1a8(%rbp)
fldt   -0xf0(%rbp)
fld    %st(0)
fstpt  -0x148(%rbp)
fmulp  %st,%st(1)
fxch   %st(1)
fmul   %st(2),%st
fsubp  %st,%st(1)
fldt   -0x70(%rbp)
fld    %st(0)
fstpt  -0x118(%rbp)
fldt   -0x30(%rbp)
fld    %st(0)
fstpt  -0x10c(%rbp)
fmulp  %st,%st(5)
fldt   -0x190(%rbp)
fxch   %st(6)
fmulp  %st,%st(1)
fsubp  %st,%st(4)
fldt   -0xe0(%rbp)
fldt   -0xa0(%rbp)
fld    %st(0)
fstpt  -0x1cc(%rbp)
fmulp  %st,%st(6)
fldt   -0x1a8(%rbp)
fmul   %st(1),%st
fsubp  %st,%st(6)
fldt   -0x1e4(%rbp)
fxch   %st(5)
fmulp  %st,%st(6)
fldt   -0x1d8(%rbp)
fxch   %st(4)
fmulp  %st,%st(2)
fxch   %st(1)
faddp  %st,%st(5)
fldt   -0x80(%rbp)
fldt   -0x40(%rbp)
fmul   %st,%st(5)
fxch   %st(4)
fmul   %st(1),%st
fsubp  %st,%st(5)
fldt   -0x1cc(%rbp)
fxch   %st(5)
fstpt  -0x1b4(%rbp)
fld    %st(2)
fmul   %st(2),%st
fstpt  -0x1c0(%rbp)
fldt   -0x148(%rbp)
fmulp  %st,%st(5)
fldt   -0x1c0(%rbp)
fsubrp %st,%st(5)
fldt   -0x1b4(%rbp)
fmulp  %st,%st(5)
fldt   -0x1a8(%rbp)
fxch   %st(5)
faddp  %st,%st(6)
fldt   -0x118(%rbp)
fxch   %st(6)
fstpt  -0x16c(%rbp)
fldt   -0x160(%rbp)
fmulp  %st,%st(6)
fldt   -0x10c(%rbp)
fxch   %st(6)
fstpt  -0x19c(%rbp)
fldt   -0x154(%rbp)
fmulp  %st,%st(6)
fldt   -0x19c(%rbp)
fsubrp %st,%st(6)
fldt   -0x190(%rbp)
fxch   %st(6)
fstpt  -0x178(%rbp)
fldt   -0xd0(%rbp)
fstpt  -0x13c(%rbp)
fldt   -0x90(%rbp)
fmul   %st,%st(6)
fxch   %st(6)
fstpt  -0x184(%rbp)
fldt   -0x13c(%rbp)
fmulp  %st,%st(5)
fldt   -0x184(%rbp)
fsubrp %st,%st(5)
fldt   -0x178(%rbp)
fmulp  %st,%st(5)
fldt   -0x16c(%rbp)
faddp  %st,%st(5)
fldt   -0x160(%rbp)
fxch   %st(5)
fstpt  -0x124(%rbp)
fldt   -0x154(%rbp)
fmul   %st(4),%st
fxch   %st(5)
fmul   %st(1),%st
fsubp  %st,%st(5)
fldt   -0x148(%rbp)
fmul   %st(6),%st
fstpt  -0x130(%rbp)
fldt   -0x13c(%rbp)
fmulp  %st,%st(3)
fldt   -0x130(%rbp)
fsubr  %st(3),%st
fmulp  %st,%st(5)
fldt   -0x124(%rbp)
faddp  %st,%st(5)
fldt   -0x118(%rbp)
fmulp  %st,%st(4)
fldt   -0x10c(%rbp)
fmulp  %st,%st(1)
fsubp  %st,%st(3)
fmulp  %st,%st(4)
fsubrp %st,%st(3)
fmulp  %st,%st(2)
faddp  %st,%st(1)
add    $0x1d0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<lldet4>:
sub    $0x18,%rsp
fldt   0x110(%rsp)
fldt   0x70(%rsp)
fld    %st(0)
fstpt  (%rsp)
fldt   0x20(%rsp)
fldt   0x60(%rsp)
fldt   0x30(%rsp)
fld    %st(0)
fstpt  -0x48(%rsp)
fmul   %st(1),%st
fxch   %st(3)
fmul   %st(2),%st
fsubp  %st,%st(3)
fxch   %st(2)
fstpt  -0x6c(%rsp)
fldt   0xc0(%rsp)
fld    %st(0)
fstpt  -0x3c(%rsp)
fldt   0x100(%rsp)
fld    %st(0)
fstpt  -0x24(%rsp)
fldt   0xd0(%rsp)
fld    %st(0)
fstpt  -0x54(%rsp)
fmulp  %st,%st(1)
fld    %st(4)
fld    %st(5)
fstpt  -0xc(%rsp)
fxch   %st(2)
fmulp  %st,%st(5)
fsubrp %st,%st(4)
fldt   -0x6c(%rsp)
fmulp  %st,%st(4)
fxch   %st(3)
fstpt  -0x60(%rsp)
fldt   0x80(%rsp)
fld    %st(0)
fstpt  -0x30(%rsp)
fldt   0x40(%rsp)
fld    %st(0)
fstpt  -0x6c(%rsp)
fmul   %st(3),%st
fxch   %st(1)
fmul   %st(2),%st
fsubp  %st,%st(1)
fstpt  -0x78(%rsp)
fldt   0xf0(%rsp)
fldt   0xb0(%rsp)
fmul   %st,%st(4)
fld    %st(1)
fld    %st(2)
fstpt  0xc(%rsp)
fldt   -0x54(%rsp)
fmulp  %st,%st(3)
fxch   %st(2)
fsubp  %st,%st(5)
fldt   -0x78(%rsp)
fmulp  %st,%st(5)
fldt   -0x60(%rsp)
faddp  %st,%st(5)
fxch   %st(4)
fstpt  -0x78(%rsp)
fldt   0x50(%rsp)
fmul   %st,%st(3)
fld    %st(0)
fxch   %st(1)
fstpt  -0x18(%rsp)
fldt   0x90(%rsp)
fld    %st(0)
fstpt  -0x60(%rsp)
fmulp  %st,%st(3)
fxch   %st(2)
fsubp  %st,%st(3)
fldt   -0x24(%rsp)
fmulp  %st,%st(4)
fldt   -0x3c(%rsp)
fmulp  %st,%st(1)
fsubrp %st,%st(3)
fxch   %st(1)
fmulp  %st,%st(2)
fldt   -0x78(%rsp)
faddp  %st,%st(2)
fxch   %st(1)
fstpt  -0x78(%rsp)
fldt   -0x30(%rsp)
fldt   -0x48(%rsp)
fmulp  %st,%st(1)
fldt   -0x6c(%rsp)
fldt   (%rsp)
fmul   %st,%st(1)
fxch   %st(1)
fsubp  %st,%st(2)
fldt   0xa0(%rsp)
fldt   -0xc(%rsp)
fmul   %st(1),%st
fldt   0xe0(%rsp)
fldt   -0x54(%rsp)
fmul   %st(1),%st
fsubp  %st,%st(2)
fxch   %st(4)
fmulp  %st,%st(1)
fldt   -0x78(%rsp)
faddp  %st,%st(1)
fxch   %st(4)
fmulp  %st,%st(2)
fldt   -0x60(%rsp)
fldt   -0x48(%rsp)
fmul   %st(1),%st
fsubp  %st,%st(3)
fldt   -0x3c(%rsp)
fmulp  %st,%st(4)
fldt   -0x24(%rsp)
fmul   %st(2),%st
fsubr  %st(4),%st
fmulp  %st,%st(3)
fxch   %st(2)
faddp  %st,%st(4)
fldt   -0x30(%rsp)
fldt   -0x18(%rsp)
fmulp  %st,%st(1)
fldt   -0x6c(%rsp)
fmulp  %st,%st(3)
fsubrp %st,%st(2)
fldt   0xc(%rsp)
fmulp  %st,%st(1)
fsubp  %st,%st(2)
fmulp  %st,%st(1)
faddp  %st,%st(1)
add    $0x18,%rsp
ret

LLVM IR (-O0):
define x86_fp80 @lldet4(x86_fp80 %0, x86_fp80 %1, x86_fp80 %2, x86_fp80 %3, x86_fp80 %4, x86_fp80 %5, x86_fp80 %6, x86_fp80 %7, x86_fp80 %8, x86_fp80 %9, x86_fp80 %10, x86_fp80 %11, x86_fp80 %12, x86_fp80 %13, x86_fp80 %14, x86_fp80 %15) {
%17 = alloca x86_fp80
%18 = alloca x86_fp80
%19 = alloca x86_fp80
%20 = alloca x86_fp80
%21 = alloca x86_fp80
%22 = alloca x86_fp80
%23 = alloca x86_fp80
%24 = alloca x86_fp80
%25 = alloca x86_fp80
%26 = alloca x86_fp80
%27 = alloca x86_fp80
%28 = alloca x86_fp80
%29 = alloca x86_fp80
%30 = alloca x86_fp80
%31 = alloca x86_fp80
%32 = alloca x86_fp80
store x86_fp80 %0, x86_fp80* %17
store x86_fp80 %1, x86_fp80* %18
store x86_fp80 %2, x86_fp80* %19
store x86_fp80 %3, x86_fp80* %20
store x86_fp80 %4, x86_fp80* %21
store x86_fp80 %5, x86_fp80* %22
store x86_fp80 %6, x86_fp80* %23
store x86_fp80 %7, x86_fp80* %24
store x86_fp80 %8, x86_fp80* %25
store x86_fp80 %9, x86_fp80* %26
store x86_fp80 %10, x86_fp80* %27
store x86_fp80 %11, x86_fp80* %28
store x86_fp80 %12, x86_fp80* %29
store x86_fp80 %13, x86_fp80* %30
store x86_fp80 %14, x86_fp80* %31
store x86_fp80 %15, x86_fp80* %32
%33 = load x86_fp80, x86_fp80* %17
%34 = load x86_fp80, x86_fp80* %22
%35 = load x86_fp80, x86_fp80* %18
%36 = load x86_fp80, x86_fp80* %21
%37 = fmul x86_fp80 %35, %36
%38 = fneg x86_fp80 %37
%39 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %33, x86_fp80 %34, x86_fp80 %38)
%40 = load x86_fp80, x86_fp80* %27
%41 = load x86_fp80, x86_fp80* %32
%42 = load x86_fp80, x86_fp80* %28
%43 = load x86_fp80, x86_fp80* %31
%44 = fmul x86_fp80 %42, %43
%45 = fneg x86_fp80 %44
%46 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %40, x86_fp80 %41, x86_fp80 %45)
%47 = load x86_fp80, x86_fp80* %17
%48 = load x86_fp80, x86_fp80* %23
%49 = load x86_fp80, x86_fp80* %19
%50 = load x86_fp80, x86_fp80* %21
%51 = fmul x86_fp80 %49, %50
%52 = fneg x86_fp80 %51
%53 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %47, x86_fp80 %48, x86_fp80 %52)
%54 = load x86_fp80, x86_fp80* %28
%55 = load x86_fp80, x86_fp80* %30
%56 = load x86_fp80, x86_fp80* %26
%57 = load x86_fp80, x86_fp80* %32
%58 = fmul x86_fp80 %56, %57
%59 = fneg x86_fp80 %58
%60 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %54, x86_fp80 %55, x86_fp80 %59)
%61 = fmul x86_fp80 %53, %60
%62 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %39, x86_fp80 %46, x86_fp80 %61)
%63 = load x86_fp80, x86_fp80* %17
%64 = load x86_fp80, x86_fp80* %24
%65 = load x86_fp80, x86_fp80* %20
%66 = load x86_fp80, x86_fp80* %21
%67 = fmul x86_fp80 %65, %66
%68 = fneg x86_fp80 %67
%69 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %63, x86_fp80 %64, x86_fp80 %68)
%70 = load x86_fp80, x86_fp80* %26
%71 = load x86_fp80, x86_fp80* %31
%72 = load x86_fp80, x86_fp80* %27
%73 = load x86_fp80, x86_fp80* %30
%74 = fmul x86_fp80 %72, %73
%75 = fneg x86_fp80 %74
%76 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %70, x86_fp80 %71, x86_fp80 %75)
%77 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %69, x86_fp80 %76, x86_fp80 %62)
%78 = load x86_fp80, x86_fp80* %19
%79 = load x86_fp80, x86_fp80* %22
%80 = load x86_fp80, x86_fp80* %18
%81 = load x86_fp80, x86_fp80* %23
%82 = fmul x86_fp80 %80, %81
%83 = fneg x86_fp80 %82
%84 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %78, x86_fp80 %79, x86_fp80 %83)
%85 = load x86_fp80, x86_fp80* %28
%86 = load x86_fp80, x86_fp80* %29
%87 = load x86_fp80, x86_fp80* %25
%88 = load x86_fp80, x86_fp80* %32
%89 = fmul x86_fp80 %87, %88
%90 = fneg x86_fp80 %89
%91 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %85, x86_fp80 %86, x86_fp80 %90)
%92 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %84, x86_fp80 %91, x86_fp80 %77)
%93 = load x86_fp80, x86_fp80* %18
%94 = load x86_fp80, x86_fp80* %24
%95 = load x86_fp80, x86_fp80* %20
%96 = load x86_fp80, x86_fp80* %22
%97 = fmul x86_fp80 %95, %96
%98 = fneg x86_fp80 %97
%99 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %93, x86_fp80 %94, x86_fp80 %98)
%100 = load x86_fp80, x86_fp80* %27
%101 = load x86_fp80, x86_fp80* %29
%102 = load x86_fp80, x86_fp80* %25
%103 = load x86_fp80, x86_fp80* %31
%104 = fmul x86_fp80 %102, %103
%105 = fneg x86_fp80 %104
%106 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %100, x86_fp80 %101, x86_fp80 %105)
%107 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %99, x86_fp80 %106, x86_fp80 %92)
%108 = load x86_fp80, x86_fp80* %19
%109 = load x86_fp80, x86_fp80* %24
%110 = load x86_fp80, x86_fp80* %20
%111 = load x86_fp80, x86_fp80* %23
%112 = fmul x86_fp80 %110, %111
%113 = fneg x86_fp80 %112
%114 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %108, x86_fp80 %109, x86_fp80 %113)
%115 = load x86_fp80, x86_fp80* %25
%116 = load x86_fp80, x86_fp80* %30
%117 = load x86_fp80, x86_fp80* %27
%118 = load x86_fp80, x86_fp80* %29
%119 = fmul x86_fp80 %117, %118
%120 = fneg x86_fp80 %119
%121 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %115, x86_fp80 %116, x86_fp80 %120)
%122 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %114, x86_fp80 %121, x86_fp80 %107)
ret x86_fp80 %122
}

LLVM IR (-O2):
define x86_fp80 @lldet4(x86_fp80 %0, x86_fp80 %1, x86_fp80 %2, x86_fp80 %3, x86_fp80 %4, x86_fp80 %5, x86_fp80 %6, x86_fp80 %7, x86_fp80 %8, x86_fp80 %9, x86_fp80 %10, x86_fp80 %11, x86_fp80 %12, x86_fp80 %13, x86_fp80 %14, x86_fp80 %15) {
%17 = fneg x86_fp80 %1
%18 = fmul x86_fp80 %17, %4
%19 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %0, x86_fp80 %5, x86_fp80 %18)
%20 = fneg x86_fp80 %11
%21 = fmul x86_fp80 %20, %14
%22 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %10, x86_fp80 %15, x86_fp80 %21)
%23 = fneg x86_fp80 %2
%24 = fmul x86_fp80 %23, %4
%25 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %0, x86_fp80 %6, x86_fp80 %24)
%26 = fneg x86_fp80 %9
%27 = fmul x86_fp80 %26, %15
%28 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %11, x86_fp80 %13, x86_fp80 %27)
%29 = fmul x86_fp80 %25, %28
%30 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %19, x86_fp80 %22, x86_fp80 %29)
%31 = fneg x86_fp80 %3
%32 = fmul x86_fp80 %31, %4
%33 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %0, x86_fp80 %7, x86_fp80 %32)
%34 = fneg x86_fp80 %10
%35 = fmul x86_fp80 %34, %13
%36 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %9, x86_fp80 %14, x86_fp80 %35)
%37 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %33, x86_fp80 %36, x86_fp80 %30)
%38 = fmul x86_fp80 %17, %6
%39 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %2, x86_fp80 %5, x86_fp80 %38)
%40 = fneg x86_fp80 %8
%41 = fmul x86_fp80 %40, %15
%42 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %11, x86_fp80 %12, x86_fp80 %41)
%43 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %39, x86_fp80 %42, x86_fp80 %37)
%44 = fmul x86_fp80 %31, %5
%45 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %1, x86_fp80 %7, x86_fp80 %44)
%46 = fmul x86_fp80 %40, %14
%47 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %10, x86_fp80 %12, x86_fp80 %46)
%48 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %45, x86_fp80 %47, x86_fp80 %43)
%49 = fmul x86_fp80 %31, %6
%50 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %2, x86_fp80 %7, x86_fp80 %49)
%51 = fmul x86_fp80 %34, %12
%52 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %8, x86_fp80 %13, x86_fp80 %51)
%53 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %50, x86_fp80 %52, x86_fp80 %48)
ret x86_fp80 %53
}