__complex__ float __cpowf(__complex__ float x, __complex__ float c) {
  return __cexpf(c * __clogf(x));
}


x86 assembly (clang, -O0):
<__cpowf>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movlpd %xmm0,-0x10(%rbp)
movlpd %xmm1,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x10(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
movss  %xmm1,-0x20(%rbp)
movss  %xmm0,-0x1c(%rbp)
movsd  -0x20(%rbp),%xmm0
mov    $0x1,%al
call   1040 <__clogf@plt>
movss  -0x4c(%rbp),%xmm0
movss  -0x48(%rbp),%xmm2
cvtsi2ss %eax,%xmm4
movss  %xmm4,-0x44(%rbp)
movaps %xmm0,%xmm1
mulss  %xmm4,%xmm1
xorps  %xmm5,%xmm5
movaps %xmm2,%xmm3
mulss  %xmm5,%xmm3
xorps  %xmm5,%xmm5
mulss  %xmm5,%xmm0
mulss  %xmm4,%xmm2
subss  %xmm3,%xmm1
movss  %xmm1,-0x40(%rbp)
addss  %xmm2,%xmm0
movss  %xmm0,-0x3c(%rbp)
ucomiss %xmm1,%xmm1
movss  %xmm1,-0x38(%rbp)
movss  %xmm0,-0x34(%rbp)
jnp    1207 <__cpowf+0xe7>
movss  -0x3c(%rbp),%xmm0
movss  -0x40(%rbp),%xmm1
ucomiss %xmm0,%xmm0
movss  %xmm1,-0x38(%rbp)
movss  %xmm0,-0x34(%rbp)
jnp    1207 <__cpowf+0xe7>
movss  -0x44(%rbp),%xmm2
movss  -0x48(%rbp),%xmm1
movss  -0x4c(%rbp),%xmm0
xorps  %xmm3,%xmm3
call   1250 <__mulsc3>
movlpd %xmm0,-0x28(%rbp)
movss  -0x28(%rbp),%xmm1
movss  -0x24(%rbp),%xmm0
movss  %xmm1,-0x38(%rbp)
movss  %xmm0,-0x34(%rbp)
movss  -0x38(%rbp),%xmm1
movss  -0x34(%rbp),%xmm0
movss  %xmm1,-0x30(%rbp)
movss  %xmm0,-0x2c(%rbp)
movsd  -0x30(%rbp),%xmm0
mov    $0x1,%al
call   1030 <__cexpf@plt>
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x8(%rbp)
movl   $0x0,-0x4(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x50,%rsp
pop    %rbp
ret
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)

x86 assembly (clang, -O2):
<__cpowf>:
sub    $0x18,%rsp
movaps %xmm1,(%rsp)
mov    $0x1,%al
call   1040 <__clogf@plt>
movaps (%rsp),%xmm4
cvtsi2ss %eax,%xmm2
movaps %xmm4,%xmm0
shufps $0xe1,%xmm4,%xmm0
xorps  %xmm1,%xmm1
mulps  %xmm1,%xmm0
movaps %xmm2,%xmm1
shufps $0x0,%xmm2,%xmm1
mulps  %xmm4,%xmm1
movaps %xmm1,%xmm3
subps  %xmm0,%xmm3
addps  %xmm0,%xmm1
movaps %xmm1,%xmm0
shufps $0x1,%xmm3,%xmm0
shufps $0xe2,%xmm3,%xmm0
ucomiss %xmm3,%xmm3
jp     1181 <__cpowf+0x61>
mov    $0x1,%al
call   1030 <__cexpf@plt>
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
xorps  %xmm0,%xmm0
movss  %xmm1,%xmm0
add    $0x18,%rsp
ret
shufps $0x55,%xmm1,%xmm1
ucomiss %xmm1,%xmm1
jnp    1167 <__cpowf+0x47>
movaps %xmm4,%xmm0
movaps %xmm4,%xmm1
shufps $0x55,%xmm4,%xmm1
xorps  %xmm3,%xmm3
call   11a0 <__mulsc3>
jmp    1167 <__cpowf+0x47>
xchg   %ax,%ax

LLVM IR (-O0):
define <2 x float> @__cpowf(<2 x float> %0, <2 x float> %1) {
%3 = alloca { float, float }
%4 = alloca { float, float }
%5 = alloca { float, float }
%6 = alloca { float, float }
%7 = alloca { float, float }
%8 = alloca { float, float }
%9 = bitcast { float, float }* %4 to <2 x float>*
store <2 x float> %0, <2 x float>* %9
%10 = bitcast { float, float }* %5 to <2 x float>*
store <2 x float> %1, <2 x float>* %10
%11 = getelementptr inbounds { float, float }, { float, float }* %5, i32 0, i32 0
%12 = load float, float* %11
%13 = getelementptr inbounds { float, float }, { float, float }* %5, i32 0, i32 1
%14 = load float, float* %13
%15 = getelementptr inbounds { float, float }, { float, float }* %4, i32 0, i32 0
%16 = load float, float* %15
%17 = getelementptr inbounds { float, float }, { float, float }* %4, i32 0, i32 1
%18 = load float, float* %17
%19 = getelementptr inbounds { float, float }, { float, float }* %6, i32 0, i32 0
%20 = getelementptr inbounds { float, float }, { float, float }* %6, i32 0, i32 1
store float %16, float* %19
store float %18, float* %20
%21 = bitcast { float, float }* %6 to <2 x float>*
%22 = load <2 x float>, <2 x float>* %21
%23 = call i32 (<2 x float>, ...) bitcast (i32 (...)* @__clogf to i32 (<2 x float>, ...)*)(<2 x float> %22)
%24 = sitofp i32 %23 to float
%25 = fmul float %12, %24
%26 = fmul float %14, 0.000000e+00
%27 = fmul float %12, 0.000000e+00
%28 = fmul float %14, %24
%29 = fsub float %25, %26
%30 = fadd float %27, %28
%31 = fcmp uno float %29, %29
br i1 %31, label %32, label %41
32: ; preds = %2
%33 = fcmp uno float %30, %30
br i1 %33, label %34, label %41
34: ; preds = %32
%35 = call <2 x float> @__mulsc3(float %12, float %14, float %24, float 0.000000e+00)
%36 = bitcast { float, float }* %7 to <2 x float>*
store <2 x float> %35, <2 x float>* %36
%37 = getelementptr inbounds { float, float }, { float, float }* %7, i32 0, i32 0
%38 = load float, float* %37
%39 = getelementptr inbounds { float, float }, { float, float }* %7, i32 0, i32 1
%40 = load float, float* %39
br label %41
41: ; preds = %34, %32, %2
%42 = phi float [ %29, %2 ], [ %29, %32 ], [ %38, %34 ]
%43 = phi float [ %30, %2 ], [ %30, %32 ], [ %40, %34 ]
%44 = getelementptr inbounds { float, float }, { float, float }* %8, i32 0, i32 0
%45 = getelementptr inbounds { float, float }, { float, float }* %8, i32 0, i32 1
store float %42, float* %44
store float %43, float* %45
%46 = bitcast { float, float }* %8 to <2 x float>*
%47 = load <2 x float>, <2 x float>* %46
%48 = call i32 (<2 x float>, ...) bitcast (i32 (...)* @__cexpf to i32 (<2 x float>, ...)*)(<2 x float> %47)
%49 = sitofp i32 %48 to float
%50 = getelementptr inbounds { float, float }, { float, float }* %3, i32 0, i32 0
%51 = getelementptr inbounds { float, float }, { float, float }* %3, i32 0, i32 1
store float %49, float* %50
store float 0.000000e+00, float* %51
%52 = bitcast { float, float }* %3 to <2 x float>*
%53 = load <2 x float>, <2 x float>* %52
ret <2 x float> %53
}

LLVM IR (-O2):
define <2 x float> @__cpowf(<2 x float> %0, <2 x float> %1) {
%3 = extractelement <2 x float> %1, i64 1
%4 = extractelement <2 x float> %1, i64 0
%5 = tail call i32 (<2 x float>, ...) bitcast (i32 (...)* @__clogf to i32 (<2 x float>, ...)*)(<2 x float> %0)
%6 = sitofp i32 %5 to float
%7 = fmul <2 x float> %1, zeroinitializer
%8 = shufflevector <2 x float> %7, <2 x float> poison, <2 x i32> <i32 1, i32 0>
%9 = insertelement <2 x float> poison, float %6, i64 0
%10 = shufflevector <2 x float> %9, <2 x float> poison, <2 x i32> zeroinitializer
%11 = fmul <2 x float> %10, %1
%12 = fsub <2 x float> %11, %8
%13 = fadd <2 x float> %11, %8
%14 = shufflevector <2 x float> %12, <2 x float> %13, <2 x i32> <i32 0, i32 3>
%15 = extractelement <2 x float> %12, i64 0
%16 = fcmp uno float %15, 0.000000e+00
br i1 %16, label %17, label %22
17: ; preds = %2
%18 = extractelement <2 x float> %13, i64 1
%19 = fcmp uno float %18, 0.000000e+00
br i1 %19, label %20, label %22
20: ; preds = %17
%21 = tail call <2 x float> @__mulsc3(float %4, float %3, float %6, float 0.000000e+00)
br label %22
22: ; preds = %20, %17, %2
%23 = phi <2 x float> [ %14, %2 ], [ %14, %17 ], [ %21, %20 ]
%24 = tail call i32 (<2 x float>, ...) bitcast (i32 (...)* @__cexpf to i32 (<2 x float>, ...)*)(<2 x float> %23)
%25 = sitofp i32 %24 to float
%26 = insertelement <2 x float> <float poison, float 0.000000e+00>, float %25, i64 0
ret <2 x float> %26
}