long double lldet3(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) {
  return a * e * i - c * e * g + b * f * g - a * f * h + c * d * h - b * d * i;
}


x86 assembly (clang, -O0):
<lldet3>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
fldt   0x90(%rbp)
fstpt  -0xa8(%rbp)
fldt   0x80(%rbp)
fldt   0x70(%rbp)
fldt   0x60(%rbp)
fldt   0x50(%rbp)
fldt   0x40(%rbp)
fldt   0x30(%rbp)
fldt   0x20(%rbp)
fstpt  -0xb4(%rbp)
fldt   0x10(%rbp)
fstpt  -0x10(%rbp)
fldt   -0xb4(%rbp)
fstpt  -0x20(%rbp)
fldt   -0xa8(%rbp)
fxch   %st(1)
fstpt  -0x30(%rbp)
fxch   %st(1)
fstpt  -0x40(%rbp)
fxch   %st(1)
fstpt  -0x50(%rbp)
fxch   %st(1)
fstpt  -0x60(%rbp)
fxch   %st(1)
fstpt  -0x70(%rbp)
fxch   %st(1)
fstpt  -0x80(%rbp)
fstpt  -0x90(%rbp)
fldt   -0x10(%rbp)
fldt   -0x50(%rbp)
fld    %st(1)
fmul   %st(1),%st
fldt   -0x90(%rbp)
fldt   -0x30(%rbp)
fld    %st(0)
fstpt  -0x9c(%rbp)
fmulp  %st,%st(3)
fldt   -0x70(%rbp)
fmul   %st,%st(3)
fxch   %st(2)
fmul   %st(1),%st
fsubp  %st,%st(3)
fldt   -0x20(%rbp)
fldt   -0x60(%rbp)
fld    %st(1)
fmul   %st(1),%st
fmulp  %st,%st(4)
fldt   -0x9c(%rbp)
fxch   %st(4)
faddp  %st,%st(5)
fmulp  %st,%st(5)
fldt   -0x80(%rbp)
fmul   %st,%st(5)
fxch   %st(4)
fsubp  %st,%st(5)
fldt   -0x40(%rbp)
fmul   %st,%st(3)
fxch   %st(3)
fmulp  %st,%st(4)
fxch   %st(3)
faddp  %st,%st(4)
fxch   %st(2)
fmulp  %st,%st(1)
fmulp  %st,%st(1)
fsubrp %st,%st(1)
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<lldet3>:
fldt   0x58(%rsp)
fldt   0x88(%rsp)
fld    %st(0)
fstpt  -0xc(%rsp)
fldt   0x68(%rsp)
fldt   0x28(%rsp)
fldt   0x48(%rsp)
fldt   0x8(%rsp)
fld    %st(0)
fmul   %st(2),%st
fxch   %st(2)
fmul   %st(3),%st
fmul   %st(4),%st
fxch   %st(2)
fmulp  %st,%st(5)
fxch   %st(4)
fsubp  %st,%st(1)
fldt   0x18(%rsp)
fld    %st(0)
fmul   %st(6),%st
fmulp  %st,%st(4)
fxch   %st(3)
faddp  %st,%st(1)
fxch   %st(3)
fmulp  %st,%st(4)
fldt   0x78(%rsp)
fmul   %st,%st(4)
fxch   %st(3)
fsubp  %st,%st(4)
fldt   0x38(%rsp)
fmul   %st,%st(1)
fxch   %st(1)
fmulp  %st,%st(3)
fxch   %st(2)
faddp  %st,%st(3)
fmulp  %st,%st(1)
fldt   -0xc(%rsp)
fmulp  %st,%st(1)
fsubrp %st,%st(1)
ret

LLVM IR (-O0):
define x86_fp80 @lldet3(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) {
%10 = alloca x86_fp80
%11 = alloca x86_fp80
%12 = alloca x86_fp80
%13 = alloca x86_fp80
%14 = alloca x86_fp80
%15 = alloca x86_fp80
%16 = alloca x86_fp80
%17 = alloca x86_fp80
%18 = alloca x86_fp80
store x86_fp80 %0, x86_fp80* %10
store x86_fp80 %1, x86_fp80* %11
store x86_fp80 %2, x86_fp80* %12
store x86_fp80 %3, x86_fp80* %13
store x86_fp80 %4, x86_fp80* %14
store x86_fp80 %5, x86_fp80* %15
store x86_fp80 %6, x86_fp80* %16
store x86_fp80 %7, x86_fp80* %17
store x86_fp80 %8, x86_fp80* %18
%19 = load x86_fp80, x86_fp80* %10
%20 = load x86_fp80, x86_fp80* %14
%21 = fmul x86_fp80 %19, %20
%22 = load x86_fp80, x86_fp80* %18
%23 = load x86_fp80, x86_fp80* %12
%24 = load x86_fp80, x86_fp80* %14
%25 = fmul x86_fp80 %23, %24
%26 = load x86_fp80, x86_fp80* %16
%27 = fmul x86_fp80 %25, %26
%28 = fneg x86_fp80 %27
%29 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %21, x86_fp80 %22, x86_fp80 %28)
%30 = load x86_fp80, x86_fp80* %11
%31 = load x86_fp80, x86_fp80* %15
%32 = fmul x86_fp80 %30, %31
%33 = load x86_fp80, x86_fp80* %16
%34 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %32, x86_fp80 %33, x86_fp80 %29)
%35 = load x86_fp80, x86_fp80* %10
%36 = load x86_fp80, x86_fp80* %15
%37 = fmul x86_fp80 %35, %36
%38 = load x86_fp80, x86_fp80* %17
%39 = fneg x86_fp80 %37
%40 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %39, x86_fp80 %38, x86_fp80 %34)
%41 = load x86_fp80, x86_fp80* %12
%42 = load x86_fp80, x86_fp80* %13
%43 = fmul x86_fp80 %41, %42
%44 = load x86_fp80, x86_fp80* %17
%45 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %43, x86_fp80 %44, x86_fp80 %40)
%46 = load x86_fp80, x86_fp80* %11
%47 = load x86_fp80, x86_fp80* %13
%48 = fmul x86_fp80 %46, %47
%49 = load x86_fp80, x86_fp80* %18
%50 = fneg x86_fp80 %48
%51 = call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %50, x86_fp80 %49, x86_fp80 %45)
ret x86_fp80 %51
}

LLVM IR (-O2):
define x86_fp80 @lldet3(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) {
%10 = fmul x86_fp80 %0, %4
%11 = fneg x86_fp80 %2
%12 = fmul x86_fp80 %11, %4
%13 = fmul x86_fp80 %12, %6
%14 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %10, x86_fp80 %8, x86_fp80 %13)
%15 = fmul x86_fp80 %1, %5
%16 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %15, x86_fp80 %6, x86_fp80 %14)
%17 = fneg x86_fp80 %0
%18 = fmul x86_fp80 %17, %5
%19 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %18, x86_fp80 %7, x86_fp80 %16)
%20 = fmul x86_fp80 %2, %3
%21 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %20, x86_fp80 %7, x86_fp80 %19)
%22 = fneg x86_fp80 %1
%23 = fmul x86_fp80 %22, %3
%24 = tail call x86_fp80 @llvm.fmuladd.f80(x86_fp80 %23, x86_fp80 %8, x86_fp80 %21)
ret x86_fp80 %24
}