long double _Complex mul_long_double_cc(long double _Complex a,
                                        long double _Complex b) {
  return a * b;
}


x86 assembly (clang, -O0):
<mul_long_double_cc>:
push   %rbp
mov    %rsp,%rbp
sub    $0xc0,%rsp
lea    0x30(%rbp),%rax
lea    0x10(%rbp),%rcx
fldt   (%rcx)
fld    %st(0)
fstpt  -0x80(%rbp)
fldt   0x10(%rcx)
fld    %st(0)
fstpt  -0x74(%rbp)
fldt   (%rax)
fld    %st(0)
fstpt  -0x68(%rbp)
fldt   0x10(%rax)
fld    %st(0)
fstpt  -0x5c(%rbp)
fld    %st(3)
fmul   %st(2),%st
fld    %st(3)
fmul   %st(2),%st
fxch   %st(5)
fmulp  %st,%st(2)
fxch   %st(3)
fmulp  %st,%st(2)
fxch   %st(2)
fsubp  %st,%st(3)
fld    %st(2)
fstpt  -0x50(%rbp)
faddp  %st,%st(1)
fld    %st(0)
fstpt  -0x44(%rbp)
fxch   %st(1)
fucomi %st(0),%st
fstpt  -0x38(%rbp)
fstpt  -0x2c(%rbp)
jnp    11a8 <mul_long_double_cc+0xa8>
jmp    1166 <mul_long_double_cc+0x66>
fldt   -0x44(%rbp)
fldt   -0x50(%rbp)
fxch   %st(1)
fucomi %st(0),%st
fxch   %st(1)
fstpt  -0x38(%rbp)
fstpt  -0x2c(%rbp)
jnp    11a8 <mul_long_double_cc+0xa8>
jmp    1183 <mul_long_double_cc+0x83>
fldt   -0x80(%rbp)
fldt   -0x74(%rbp)
fldt   -0x68(%rbp)
fldt   -0x5c(%rbp)
mov    %rsp,%rax
fstpt  0x30(%rax)
fstpt  0x20(%rax)
fstpt  0x10(%rax)
fstpt  (%rax)
call   11d0 <__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)
nop

x86 assembly (clang, -O2):
<mul_long_double_cc>:
sub    $0x48,%rsp
fldt   0x50(%rsp)
fldt   0x60(%rsp)
fldt   0x70(%rsp)
fldt   0x80(%rsp)
fld    %st(3)
fmul   %st(2),%st
fld    %st(3)
fmul   %st(2),%st
fsubrp %st,%st(1)
fld    %st(4)
fmul   %st(2),%st
fld    %st(4)
fmul   %st(4),%st
faddp  %st,%st(1)
fxch   %st(1)
fucomi %st(0),%st
jp     115e <mul_long_double_cc+0x5e>
fstp   %st(5)
fstp   %st(3)
fstp   %st(1)
fstp   %st(0)
fldz
fldz
fldz
fldz
fxch   %st(3)
fxch   %st(5)
fxch   %st(2)
fxch   %st(4)
fxch   %st(1)
fxch   %st(3)
fxch   %st(2)
fxch   %st(1)
fstp   %st(5)
fstp   %st(3)
fstp   %st(1)
fstp   %st(0)
add    $0x48,%rsp
ret
fxch   %st(1)
fucomi %st(0),%st
jnp    1151 <mul_long_double_cc+0x51>
fstp   %st(1)
fstp   %st(0)
fstpt  0x30(%rsp)
fstpt  0x20(%rsp)
fstpt  0x10(%rsp)
fstpt  (%rsp)
call   11a0 <__mulxc3>
fldz
fldz
fldz
fldz
fxch   %st(3)
fxch   %st(5)
fxch   %st(2)
fxch   %st(4)
fxch   %st(1)
fxch   %st(3)
fxch   %st(2)
jmp    1151 <mul_long_double_cc+0x51>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax

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

LLVM IR (-O2):
define { x86_fp80, x86_fp80 } @mul_long_double_cc({ x86_fp80, x86_fp80 }* nocapture byval({ x86_fp80, x86_fp80 }) align 16 %0, { x86_fp80, x86_fp80 }* nocapture byval({ x86_fp80, x86_fp80 }) align 16 %1) {
%3 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i64 0, i32 0
%4 = load x86_fp80, x86_fp80* %3
%5 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i64 0, i32 1
%6 = load x86_fp80, x86_fp80* %5
%7 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %1, i64 0, i32 0
%8 = load x86_fp80, x86_fp80* %7
%9 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %1, i64 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 %14, %13
%17 = fcmp uno x86_fp80 %15, 0xK00000000000000000000
br i1 %17, label %18, label %24
18: ; preds = %2
%19 = fcmp uno x86_fp80 %16, 0xK00000000000000000000
br i1 %19, label %20, label %24
20: ; preds = %18
%21 = tail 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, %2
%25 = phi x86_fp80 [ %15, %2 ], [ %15, %18 ], [ %22, %20 ]
%26 = phi x86_fp80 [ %16, %2 ], [ %16, %18 ], [ %23, %20 ]
%27 = insertvalue { x86_fp80, x86_fp80 } poison, x86_fp80 %25, 0
%28 = insertvalue { x86_fp80, x86_fp80 } %27, x86_fp80 %26, 1
ret { x86_fp80, x86_fp80 } %28
}