long double _Complex TestLDC(long double _Complex x) { return x * x; }


x86 assembly (clang, -O0):
<TestLDC>:
push   %rbp
mov    %rsp,%rbp
sub    $0xc0,%rsp
lea    0x10(%rbp),%rax
fldt   (%rax)
fld    %st(0)
fstpt  -0x80(%rbp)
fld    %st(0)
fstpt  -0x74(%rbp)
fldt   0x10(%rax)
fld    %st(0)
fstpt  -0x68(%rbp)
fld    %st(0)
fstpt  -0x5c(%rbp)
fld    %st(1)
fmul   %st(2),%st
fld    %st(1)
fmul   %st(2),%st
fxch   %st(3)
fmulp  %st,%st(2)
fsubp  %st,%st(2)
fld    %st(1)
fstpt  -0x50(%rbp)
fadd   %st,%st(0)
fld    %st(0)
fstpt  -0x44(%rbp)
fxch   %st(1)
fucomi %st(0),%st
fstpt  -0x38(%rbp)
fstpt  -0x2c(%rbp)
jnp    1199 <TestLDC+0x99>
jmp    1157 <TestLDC+0x57>
fldt   -0x44(%rbp)
fldt   -0x50(%rbp)
fxch   %st(1)
fucomi %st(0),%st
fxch   %st(1)
fstpt  -0x38(%rbp)
fstpt  -0x2c(%rbp)
jnp    1199 <TestLDC+0x99>
jmp    1174 <TestLDC+0x74>
fldt   -0x74(%rbp)
fldt   -0x5c(%rbp)
fldt   -0x80(%rbp)
fldt   -0x68(%rbp)
mov    %rsp,%rax
fstpt  0x30(%rax)
fstpt  0x20(%rax)
fstpt  0x10(%rax)
fstpt  (%rax)
call   11c0 <__mulxc3>
fstpt  -0x38(%rbp)
fstpt  -0x2c(%rbp)
fldt   -0x38(%rbp)
fldt   -0x2c(%rbp)
fxch   %st(1)
fstpt  -0x20(%rbp)
fstpt  -0x10(%rbp)
fldt   -0x10(%rbp)
fldt   -0x20(%rbp)
add    $0xc0,%rsp
pop    %rbp
ret
cs nopw 0x0(%rax,%rax,1)

x86 assembly (clang, -O2):
<TestLDC>:
sub    $0x48,%rsp
fldt   0x50(%rsp)
fldt   0x60(%rsp)
fld    %st(1)
fmul   %st(2),%st
fld    %st(1)
fmul   %st(2),%st
fsubrp %st,%st(1)
fld    %st(2)
fmul   %st(2),%st
fadd   %st,%st(0)
fxch   %st(1)
fucomi %st(0),%st
jp     113b <TestLDC+0x3b>
fstp   %st(3)
fstp   %st(1)
fldz
fldz
fxch   %st(1)
fxch   %st(3)
fxch   %st(1)
fxch   %st(2)
fstp   %st(3)
fstp   %st(1)
add    $0x48,%rsp
ret
fxch   %st(1)
fucomi %st(0),%st
jnp    1132 <TestLDC+0x32>
fstp   %st(1)
fstp   %st(0)
fld    %st(0)
fstpt  0x30(%rsp)
fld    %st(1)
fstpt  0x20(%rsp)
fstpt  0x10(%rsp)
fstpt  (%rsp)
call   1170 <__mulxc3>
fldz
fldz
fxch   %st(1)
fxch   %st(3)
fxch   %st(1)
fxch   %st(2)
fxch   %st(1)
jmp    1132 <TestLDC+0x32>
nopl   (%rax)

LLVM IR (-O0):
define { x86_fp80, x86_fp80 } @TestLDC({ x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %0) {
%2 = alloca { x86_fp80, x86_fp80 }
%3 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i32 0, i32 0
%4 = load x86_fp80, x86_fp80* %3
%5 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i32 0, i32 1
%6 = load x86_fp80, x86_fp80* %5
%7 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i32 0, i32 0
%8 = load x86_fp80, x86_fp80* %7
%9 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i32 0, i32 1
%10 = load x86_fp80, x86_fp80* %9
%11 = fmul x86_fp80 %4, %8
%12 = fmul x86_fp80 %6, %10
%13 = fmul x86_fp80 %4, %10
%14 = fmul x86_fp80 %6, %8
%15 = fsub x86_fp80 %11, %12
%16 = fadd x86_fp80 %13, %14
%17 = fcmp uno x86_fp80 %15, %15
br i1 %17, label %18, label %24
18: ; preds = %1
%19 = fcmp uno x86_fp80 %16, %16
br i1 %19, label %20, label %24
20: ; preds = %18
%21 = call { x86_fp80, x86_fp80 } @__mulxc3(x86_fp80 %4, x86_fp80 %6, x86_fp80 %8, x86_fp80 %10)
%22 = extractvalue { x86_fp80, x86_fp80 } %21, 0
%23 = extractvalue { x86_fp80, x86_fp80 } %21, 1
br label %24
24: ; preds = %20, %18, %1
%25 = phi x86_fp80 [ %15, %1 ], [ %15, %18 ], [ %22, %20 ]
%26 = phi x86_fp80 [ %16, %1 ], [ %16, %18 ], [ %23, %20 ]
%27 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %2, i32 0, i32 0
%28 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %2, i32 0, i32 1
store x86_fp80 %25, x86_fp80* %27
store x86_fp80 %26, x86_fp80* %28
%29 = load { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %2
ret { x86_fp80, x86_fp80 } %29
}

LLVM IR (-O2):
define { x86_fp80, x86_fp80 } @TestLDC({ x86_fp80, x86_fp80 }* nocapture byval({ x86_fp80, x86_fp80 }) align 16 %0) {
%2 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i64 0, i32 0
%3 = load x86_fp80, x86_fp80* %2
%4 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i64 0, i32 1
%5 = load x86_fp80, x86_fp80* %4
%6 = fmul x86_fp80 %3, %3
%7 = fmul x86_fp80 %5, %5
%8 = fmul x86_fp80 %3, %5
%9 = fsub x86_fp80 %6, %7
%10 = fadd x86_fp80 %8, %8
%11 = fcmp uno x86_fp80 %9, 0xK00000000000000000000
br i1 %11, label %12, label %18
12: ; preds = %1
%13 = fcmp uno x86_fp80 %10, 0xK00000000000000000000
br i1 %13, label %14, label %18
14: ; preds = %12
%15 = tail call { x86_fp80, x86_fp80 } @__mulxc3(x86_fp80 %3, x86_fp80 %5, x86_fp80 %3, x86_fp80 %5)
%16 = extractvalue { x86_fp80, x86_fp80 } %15, 0
%17 = extractvalue { x86_fp80, x86_fp80 } %15, 1
br label %18
18: ; preds = %14, %12, %1
%19 = phi x86_fp80 [ %9, %1 ], [ %9, %12 ], [ %16, %14 ]
%20 = phi x86_fp80 [ %10, %1 ], [ %10, %12 ], [ %17, %14 ]
%21 = insertvalue { x86_fp80, x86_fp80 } poison, x86_fp80 %19, 0
%22 = insertvalue { x86_fp80, x86_fp80 } %21, x86_fp80 %20, 1
ret { x86_fp80, x86_fp80 } %22
}