__complex__ long double __cpowl(__complex__ long double x,
                                __complex__ long double c) {
  return __cexpl(c * __clogl(x));
}


x86 assembly (clang, -O0):
<__cpowl>:
push   %rbp
mov    %rsp,%rbp
sub    $0x100,%rsp
lea    0x30(%rbp),%rcx
lea    0x10(%rbp),%rax
fldt   (%rcx)
fstpt  -0xbc(%rbp)
fldt   0x10(%rcx)
fstpt  -0xb0(%rbp)
fldt   (%rax)
fldt   0x10(%rax)
fxch   %st(1)
fstpt  -0x40(%rbp)
fstpt  -0x30(%rbp)
movaps -0x40(%rbp),%xmm0
movaps -0x30(%rbp),%xmm1
mov    %rsp,%rax
movaps %xmm1,0x10(%rax)
movaps %xmm0,(%rax)
xor    %eax,%eax
call   1040 <__clogl@plt>
fldt   -0xbc(%rbp)
fldt   -0xb0(%rbp)
mov    %eax,-0x64(%rbp)
fildl  -0x64(%rbp)
fld    %st(0)
fstpt  -0xa4(%rbp)
fld    %st(2)
fmul   %st(1),%st
fldz
fld    %st(3)
fmul   %st(1),%st
fxch   %st(5)
fmulp  %st,%st(1)
fxch   %st(3)
fmulp  %st,%st(2)
fsubp  %st,%st(3)
fld    %st(2)
fstpt  -0x98(%rbp)
faddp  %st,%st(1)
fld    %st(0)
fstpt  -0x8c(%rbp)
fxch   %st(1)
fucomi %st(0),%st
fstpt  -0x80(%rbp)
fstpt  -0x74(%rbp)
jnp    120f <__cpowl+0xef>
jmp    11bf <__cpowl+0x9f>
fldt   -0x8c(%rbp)
fldt   -0x98(%rbp)
fxch   %st(1)
fucomi %st(0),%st
fxch   %st(1)
fstpt  -0x80(%rbp)
fstpt  -0x74(%rbp)
jnp    120f <__cpowl+0xef>
jmp    11e2 <__cpowl+0xc2>
fldt   -0xbc(%rbp)
fldt   -0xb0(%rbp)
fldt   -0xa4(%rbp)
mov    %rsp,%rax
fldz
fstpt  0x30(%rax)
fstpt  0x20(%rax)
fstpt  0x10(%rax)
fstpt  (%rax)
call   1260 <__mulxc3>
fstpt  -0x80(%rbp)
fstpt  -0x74(%rbp)
fldt   -0x80(%rbp)
fldt   -0x74(%rbp)
fxch   %st(1)
fstpt  -0x60(%rbp)
fstpt  -0x50(%rbp)
movaps -0x60(%rbp),%xmm0
movaps -0x50(%rbp),%xmm1
mov    %rsp,%rax
movaps %xmm1,0x10(%rax)
movaps %xmm0,(%rax)
xor    %eax,%eax
call   1030 <__cexpl@plt>
mov    %eax,-0x68(%rbp)
fildl  -0x68(%rbp)
fstpt  -0x20(%rbp)
fldz
fstpt  -0x10(%rbp)
fldt   -0x10(%rbp)
fldt   -0x20(%rbp)
add    $0x100,%rsp
pop    %rbp
ret
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)

x86 assembly (clang, -O2):
<__cpowl>:
sub    $0xb8,%rsp
fldt   0xe0(%rsp)
fstpt  0x64(%rsp)
fldt   0xf0(%rsp)
fstpt  0x58(%rsp)
fldt   0xc0(%rsp)
fldt   0xd0(%rsp)
fxch   %st(1)
fstpt  0x90(%rsp)
fstpt  0xa0(%rsp)
movaps 0x90(%rsp),%xmm0
movaps 0xa0(%rsp),%xmm1
movaps %xmm1,0x10(%rsp)
movaps %xmm0,(%rsp)
xor    %eax,%eax
call   1040 <__clogl@plt>
fldt   0x58(%rsp)
fldt   0x64(%rsp)
mov    %eax,0x48(%rsp)
fildl  0x48(%rsp)
fld    %st(1)
fmul   %st(1),%st
fldz
fld    %st(4)
fmul   %st(1),%st
fsubrp %st,%st(2)
fld    %st(0)
fstpt  0x4c(%rsp)
fmul   %st(3),%st
fld    %st(4)
fmul   %st(3),%st
faddp  %st,%st(1)
fxch   %st(1)
fucomi %st(0),%st
jp     1201 <__cpowl+0xe1>
fstp   %st(2)
fstp   %st(2)
fstp   %st(2)
fldz
fldz
fldz
fxch   %st(4)
fxch   %st(1)
fxch   %st(3)
fstp   %st(2)
fstp   %st(2)
fstp   %st(2)
fstpt  0x70(%rsp)
fstpt  0x80(%rsp)
movaps 0x70(%rsp),%xmm0
movaps 0x80(%rsp),%xmm1
movaps %xmm1,0x10(%rsp)
movaps %xmm0,(%rsp)
xor    %eax,%eax
call   1030 <__cexpl@plt>
mov    %eax,0x44(%rsp)
fildl  0x44(%rsp)
fldt   0x4c(%rsp)
fxch   %st(1)
add    $0xb8,%rsp
ret
fxch   %st(1)
fucomi %st(0),%st
jnp    11bd <__cpowl+0x9d>
fstp   %st(1)
fstp   %st(0)
fldt   0x4c(%rsp)
fstpt  0x30(%rsp)
fstpt  0x20(%rsp)
fxch   %st(1)
fstpt  0x10(%rsp)
fstpt  (%rsp)
call   1240 <__mulxc3>
fldz
fldz
fldz
fxch   %st(4)
fxch   %st(1)
fxch   %st(3)
fxch   %st(1)
jmp    11bd <__cpowl+0x9d>
cs nopw 0x0(%rax,%rax,1)
nop

LLVM IR (-O0):
define { x86_fp80, x86_fp80 } @__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 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %1, i32 0, i32 0
%7 = load x86_fp80, x86_fp80* %6
%8 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %1, i32 0, i32 1
%9 = load x86_fp80, x86_fp80* %8
%10 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i32 0, i32 0
%11 = load x86_fp80, x86_fp80* %10
%12 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i32 0, i32 1
%13 = load x86_fp80, x86_fp80* %12
%14 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %4, i32 0, i32 0
%15 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %4, i32 0, i32 1
store x86_fp80 %11, x86_fp80* %14
store x86_fp80 %13, x86_fp80* %15
%16 = call i32 ({ x86_fp80, x86_fp80 }*, ...) bitcast (i32 (...)* @__clogl to i32 ({ x86_fp80, x86_fp80 }*, ...)*)({ x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %4)
%17 = sitofp i32 %16 to x86_fp80
%18 = fmul x86_fp80 %7, %17
%19 = fmul x86_fp80 %9, 0xK00000000000000000000
%20 = fmul x86_fp80 %7, 0xK00000000000000000000
%21 = fmul x86_fp80 %9, %17
%22 = fsub x86_fp80 %18, %19
%23 = fadd x86_fp80 %20, %21
%24 = fcmp uno x86_fp80 %22, %22
br i1 %24, label %25, label %31
25: ; preds = %2
%26 = fcmp uno x86_fp80 %23, %23
br i1 %26, label %27, label %31
27: ; preds = %25
%28 = call { x86_fp80, x86_fp80 } @__mulxc3(x86_fp80 %7, x86_fp80 %9, x86_fp80 %17, x86_fp80 0xK00000000000000000000)
%29 = extractvalue { x86_fp80, x86_fp80 } %28, 0
%30 = extractvalue { x86_fp80, x86_fp80 } %28, 1
br label %31
31: ; preds = %27, %25, %2
%32 = phi x86_fp80 [ %22, %2 ], [ %22, %25 ], [ %29, %27 ]
%33 = phi x86_fp80 [ %23, %2 ], [ %23, %25 ], [ %30, %27 ]
%34 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %5, i32 0, i32 0
%35 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %5, i32 0, i32 1
store x86_fp80 %32, x86_fp80* %34
store x86_fp80 %33, x86_fp80* %35
%36 = call i32 ({ x86_fp80, x86_fp80 }*, ...) bitcast (i32 (...)* @__cexpl to i32 ({ x86_fp80, x86_fp80 }*, ...)*)({ x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %5)
%37 = sitofp i32 %36 to x86_fp80
%38 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %3, i32 0, i32 0
%39 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %3, i32 0, i32 1
store x86_fp80 %37, x86_fp80* %38
store x86_fp80 0xK00000000000000000000, x86_fp80* %39
%40 = load { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %3
ret { x86_fp80, x86_fp80 } %40
}

LLVM IR (-O2):
define { x86_fp80, x86_fp80 } @__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 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %1, i64 0, i32 0
%6 = load x86_fp80, x86_fp80* %5
%7 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %1, i64 0, i32 1
%8 = load x86_fp80, x86_fp80* %7
%9 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i64 0, i32 0
%10 = load x86_fp80, x86_fp80* %9
%11 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %0, i64 0, i32 1
%12 = load x86_fp80, x86_fp80* %11
%13 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %3, i64 0, i32 0
%14 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %3, i64 0, i32 1
store x86_fp80 %10, x86_fp80* %13
store x86_fp80 %12, x86_fp80* %14
%15 = tail call i32 ({ x86_fp80, x86_fp80 }*, ...) bitcast (i32 (...)* @__clogl to i32 ({ x86_fp80, x86_fp80 }*, ...)*)({ x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %3)
%16 = sitofp i32 %15 to x86_fp80
%17 = fmul x86_fp80 %6, %16
%18 = fmul x86_fp80 %8, 0xK00000000000000000000
%19 = fmul x86_fp80 %6, 0xK00000000000000000000
%20 = fmul x86_fp80 %8, %16
%21 = fsub x86_fp80 %17, %18
%22 = fadd x86_fp80 %19, %20
%23 = fcmp uno x86_fp80 %21, 0xK00000000000000000000
br i1 %23, label %24, label %30
24: ; preds = %2
%25 = fcmp uno x86_fp80 %22, 0xK00000000000000000000
br i1 %25, label %26, label %30
26: ; preds = %24
%27 = tail call { x86_fp80, x86_fp80 } @__mulxc3(x86_fp80 %6, x86_fp80 %8, x86_fp80 %16, x86_fp80 0xK00000000000000000000)
%28 = extractvalue { x86_fp80, x86_fp80 } %27, 0
%29 = extractvalue { x86_fp80, x86_fp80 } %27, 1
br label %30
30: ; preds = %26, %24, %2
%31 = phi x86_fp80 [ %21, %2 ], [ %21, %24 ], [ %28, %26 ]
%32 = phi x86_fp80 [ %22, %2 ], [ %22, %24 ], [ %29, %26 ]
%33 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %4, i64 0, i32 0
%34 = getelementptr inbounds { x86_fp80, x86_fp80 }, { x86_fp80, x86_fp80 }* %4, i64 0, i32 1
store x86_fp80 %31, x86_fp80* %33
store x86_fp80 %32, x86_fp80* %34
%35 = tail call i32 ({ x86_fp80, x86_fp80 }*, ...) bitcast (i32 (...)* @__cexpl to i32 ({ x86_fp80, x86_fp80 }*, ...)*)({ x86_fp80, x86_fp80 }* byval({ x86_fp80, x86_fp80 }) align 16 %4)
%36 = sitofp i32 %35 to x86_fp80
%37 = insertvalue { x86_fp80, x86_fp80 } poison, x86_fp80 %36, 0
%38 = insertvalue { x86_fp80, x86_fp80 } %37, x86_fp80 0xK00000000000000000000, 1
ret { x86_fp80, x86_fp80 } %38
}