void test_cpowl(_Complex long double ld1, _Complex long double ld2) {
  if (cpowl(ld1, ld2) != cpowl(ld1, ld2))
    link_failure_cpowl();
}


x86 assembly (clang, -O0):
<test_cpowl>:
push   %rbp
mov    %rsp,%rbp
sub    $0xf0,%rsp
lea    0x30(%rbp),%rax
mov    %rax,-0xa0(%rbp)
lea    0x10(%rbp),%rcx
mov    %rcx,-0xa8(%rbp)
fldt   (%rcx)
fldt   0x10(%rcx)
fldt   (%rax)
fldt   0x10(%rax)
fxch   %st(3)
fstpt  -0x20(%rbp)
fxch   %st(1)
fstpt  -0x10(%rbp)
fstpt  -0x40(%rbp)
fstpt  -0x30(%rbp)
movaps -0x40(%rbp),%xmm0
movaps -0x30(%rbp),%xmm1
mov    %rsp,%rax
movaps %xmm1,0x30(%rax)
movaps %xmm0,0x20(%rax)
movaps -0x20(%rbp),%xmm0
movaps -0x10(%rbp),%xmm1
movaps %xmm1,0x10(%rax)
movaps %xmm0,(%rax)
call   1040 <cpowl@plt>
mov    -0xa8(%rbp),%rcx
mov    -0xa0(%rbp),%rax
fstpt  -0x98(%rbp)
fstpt  -0x8c(%rbp)
fldt   (%rcx)
fldt   0x10(%rcx)
fldt   (%rax)
fldt   0x10(%rax)
fxch   %st(3)
fstpt  -0x60(%rbp)
fxch   %st(1)
fstpt  -0x50(%rbp)
fstpt  -0x80(%rbp)
fstpt  -0x70(%rbp)
movaps -0x80(%rbp),%xmm0
movaps -0x70(%rbp),%xmm1
mov    %rsp,%rax
movaps %xmm1,0x30(%rax)
movaps %xmm0,0x20(%rax)
movaps -0x60(%rbp),%xmm0
movaps -0x50(%rbp),%xmm1
movaps %xmm1,0x10(%rax)
movaps %xmm0,(%rax)
call   1040 <cpowl@plt>
fldt   -0x98(%rbp)
fldt   -0x8c(%rbp)
fxch   %st(1)
fucomip %st(2),%st
fstp   %st(1)
setp   %cl
setne  %al
or     %cl,%al
fucomip %st(1),%st
fstp   %st(0)
setp   %dl
setne  %cl
or     %dl,%cl
or     %cl,%al
test   $0x1,%al
jne    1212 <test_cpowl+0xf2>
jmp    1219 <test_cpowl+0xf9>
mov    $0x0,%al
call   1030 <link_failure_cpowl@plt>
add    $0xf0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<test_cpowl>:
sub    $0x118,%rsp
fldt   0x120(%rsp)
fld    %st(0)
fstpt  0x78(%rsp)
fldt   0x130(%rsp)
fld    %st(0)
fstpt  0x6c(%rsp)
fldt   0x140(%rsp)
fld    %st(0)
fstpt  0x60(%rsp)
fldt   0x150(%rsp)
fld    %st(0)
fstpt  0x54(%rsp)
fxch   %st(3)
fstpt  0xf0(%rsp)
fxch   %st(1)
fstpt  0x100(%rsp)
fstpt  0xd0(%rsp)
fstpt  0xe0(%rsp)
movaps 0xd0(%rsp),%xmm0
movaps 0xe0(%rsp),%xmm1
movaps %xmm1,0x30(%rsp)
movaps %xmm0,0x20(%rsp)
movaps 0xf0(%rsp),%xmm0
movaps 0x100(%rsp),%xmm1
movaps %xmm1,0x10(%rsp)
movaps %xmm0,(%rsp)
call   1040 <cpowl@plt>
fstpt  0x84(%rsp)
fstpt  0x48(%rsp)
fldt   0x78(%rsp)
fstpt  0xb0(%rsp)
fldt   0x6c(%rsp)
fstpt  0xc0(%rsp)
fldt   0x60(%rsp)
fstpt  0x90(%rsp)
fldt   0x54(%rsp)
fstpt  0xa0(%rsp)
movaps 0x90(%rsp),%xmm0
movaps 0xa0(%rsp),%xmm1
movaps %xmm1,0x30(%rsp)
movaps %xmm0,0x20(%rsp)
movaps 0xb0(%rsp),%xmm0
movaps 0xc0(%rsp),%xmm1
movaps %xmm1,0x10(%rsp)
movaps %xmm0,(%rsp)
call   1040 <cpowl@plt>
fldt   0x84(%rsp)
fucomip %st(1),%st
fstp   %st(0)
jne    1249 <test_cpowl+0x129>
jp     1249 <test_cpowl+0x129>
fldt   0x48(%rsp)
fucomip %st(1),%st
fstp   %st(0)
fldz
jne    1249 <test_cpowl+0x129>
jp     1249 <test_cpowl+0x129>
fstp   %st(0)
add    $0x118,%rsp
ret
fstp   %st(0)
xor    %eax,%eax
add    $0x118,%rsp
jmp    1030 <link_failure_cpowl@plt>

LLVM IR (-O0):
define void @test_cpowl({ 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 = alloca { x86_fp80, x86_fp80 }
%5 = alloca { x86_fp80, x86_fp80 }
%6 = alloca { x86_fp80, x86_fp80 }
%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 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %1, i32 0, i32 0
%12 = load x86_fp80, x86_fp80* %11
%13 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %1, i32 0, i32 1
%14 = load x86_fp80, x86_fp80* %13
%15 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %3, i32 0, i32 0
%16 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %3, i32 0, i32 1
store x86_fp80 %8, x86_fp80* %15
store x86_fp80 %10, x86_fp80* %16
%17 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %4, i32 0, i32 0
%18 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %4, i32 0, i32 1
store x86_fp80 %12, x86_fp80* %17
store x86_fp80 %14, x86_fp80* %18
%19 = call { x86_fp80, x86_fp80 } @cpowl({ x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %3, { x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %4)
%20 = extractvalue { x86_fp80, x86_fp80 } %19, 0
%21 = extractvalue { x86_fp80, x86_fp80 } %19, 1
%22 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i32 0, i32 0
%23 = load x86_fp80, x86_fp80* %22
%24 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i32 0, i32 1
%25 = load x86_fp80, x86_fp80* %24
%26 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %1, i32 0, i32 0
%27 = load x86_fp80, x86_fp80* %26
%28 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %1, i32 0, i32 1
%29 = load x86_fp80, x86_fp80* %28
%30 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %5, i32 0, i32 0
%31 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %5, i32 0, i32 1
store x86_fp80 %23, x86_fp80* %30
store x86_fp80 %25, x86_fp80* %31
%32 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %6, i32 0, i32 0
%33 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %6, i32 0, i32 1
store x86_fp80 %27, x86_fp80* %32
store x86_fp80 %29, x86_fp80* %33
%34 = call { x86_fp80, x86_fp80 } @cpowl({ x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %5, { x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %6)
%35 = extractvalue { x86_fp80, x86_fp80 } %34, 0
%36 = extractvalue { x86_fp80, x86_fp80 } %34, 1
%37 = fcmp une x86_fp80 %20, %35
%38 = fcmp une x86_fp80 %21, %36
%39 = or i1 %37, %38
br i1 %39, label %40, label %42
40: ; preds = %2
%41 = call i32 (...) @link_failure_cpowl()
br label %42
42: ; preds = %40, %2
ret void
}

LLVM IR (-O2):
define void @test_cpowl({ 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 = alloca { x86_fp80, x86_fp80 }
%4 = alloca { x86_fp80, x86_fp80 }
%5 = alloca { x86_fp80, x86_fp80 }
%6 = alloca { x86_fp80, x86_fp80 }
%7 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i64 0, i32 0
%8 = load x86_fp80, x86_fp80* %7
%9 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i64 0, i32 1
%10 = load x86_fp80, x86_fp80* %9
%11 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %1, i64 0, i32 0
%12 = load x86_fp80, x86_fp80* %11
%13 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %1, i64 0, i32 1
%14 = load x86_fp80, x86_fp80* %13
%15 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %3, i64 0, i32 0
%16 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %3, i64 0, i32 1
store x86_fp80 %8, x86_fp80* %15
store x86_fp80 %10, x86_fp80* %16
%17 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %4, i64 0, i32 0
%18 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %4, i64 0, i32 1
store x86_fp80 %12, x86_fp80* %17
store x86_fp80 %14, x86_fp80* %18
%19 = tail call { x86_fp80, x86_fp80 } @cpowl({ x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %3, { x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %4)
%20 = extractvalue { x86_fp80, x86_fp80 } %19, 0
%21 = extractvalue { x86_fp80, x86_fp80 } %19, 1
%22 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %5, i64 0, i32 0
%23 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %5, i64 0, i32 1
store x86_fp80 %8, x86_fp80* %22
store x86_fp80 %10, x86_fp80* %23
%24 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %6, i64 0, i32 0
%25 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %6, i64 0, i32 1
store x86_fp80 %12, x86_fp80* %24
store x86_fp80 %14, x86_fp80* %25
%26 = tail call { x86_fp80, x86_fp80 } @cpowl({ x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %5, { x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %6)
%27 = extractvalue { x86_fp80, x86_fp80 } %26, 0
%28 = extractvalue { x86_fp80, x86_fp80 } %26, 1
%29 = fcmp une x86_fp80 %20, %27
%30 = fcmp une x86_fp80 %21, %28
%31 = or i1 %29, %30
br i1 %31, label %32, label %34
32: ; preds = %2
%33 = tail call i32 (...) @link_failure_cpowl()
br label %34
34: ; preds = %32, %2
ret void
}