double _myPow(double x, int n) {
  if (n == 0)
    return 1;
  return (n % 2 == 0) ? _myPow(x * x, n / 2) : x * _myPow(x * x, n / 2);
}


x86 assembly (clang, -O0):
<_myPow>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
movsd  %xmm0,-0x10(%rbp)
mov    %edi,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    113c <_myPow+0x2c>
movsd  0xece(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    11b7 <_myPow+0xa7>
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1176 <_myPow+0x66>
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%edi
call   1030 <_myPow@plt>
movsd  %xmm0,-0x20(%rbp)
jmp    11ad <_myPow+0x9d>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%edi
call   1030 <_myPow@plt>
movaps %xmm0,%xmm1
movsd  -0x28(%rbp),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<_myPow>:
push   %rax
movapd %xmm0,%xmm2
movsd  0xee3(%rip),%xmm0
test   %edi,%edi
je     114c <_myPow+0x3c>
movapd %xmm2,%xmm1
mov    %edi,%eax
nopw   0x0(%rax,%rax,1)
mulsd  %xmm1,%xmm1
shr    $0x1f,%eax
add    %edi,%eax
sar    %eax
test   $0x1,%dil
jne    114e <_myPow+0x3e>
movapd %xmm1,%xmm2
cmp    $0x1,%edi
mov    %eax,%edi
ja     1130 <_myPow+0x20>
pop    %rax
ret
movapd %xmm1,%xmm0
mov    %eax,%edi
movsd  %xmm2,(%rsp)
call   1030 <_myPow@plt>
movsd  (%rsp),%xmm1
mulsd  %xmm0,%xmm1
movapd %xmm1,%xmm0
pop    %rax
ret

LLVM IR (-O0):
define double @_myPow(double %0, i32 %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca i32
store double %0, double* %4
store i32 %1, i32* %5
%6 = load i32, i32* %5
%7 = icmp eq i32 %6, 0
br i1 %7, label %8, label %9
8: ; preds = %2
store double 1.000000e+00, double* %3
br label %31
9: ; preds = %2
%10 = load i32, i32* %5
%11 = srem i32 %10, 2
%12 = icmp eq i32 %11, 0
br i1 %12, label %13, label %20
13: ; preds = %9
%14 = load double, double* %4
%15 = load double, double* %4
%16 = fmul double %14, %15
%17 = load i32, i32* %5
%18 = sdiv i32 %17, 2
%19 = call double @_myPow(double %16, i32 %18)
br label %29
20: ; preds = %9
%21 = load double, double* %4
%22 = load double, double* %4
%23 = load double, double* %4
%24 = fmul double %22, %23
%25 = load i32, i32* %5
%26 = sdiv i32 %25, 2
%27 = call double @_myPow(double %24, i32 %26)
%28 = fmul double %21, %27
br label %29
29: ; preds = %20, %13
%30 = phi double [ %19, %13 ], [ %28, %20 ]
store double %30, double* %3
br label %31
31: ; preds = %29, %8
%32 = load double, double* %3
ret double %32
}

LLVM IR (-O2):
define double @_myPow(double %0, i32 %1) {
%3 = icmp eq i32 %1, 0
br i1 %3, label %13, label %4
4: ; preds = %2, %11
%5 = phi i32 [ %10, %11 ], [ %1, %2 ]
%6 = phi double [ %9, %11 ], [ %0, %2 ]
%7 = and i32 %5, 1
%8 = icmp eq i32 %7, 0
%9 = fmul double %6, %6
%10 = sdiv i32 %5, 2
br i1 %8, label %11, label %15
11: ; preds = %4
%12 = icmp ult i32 %5, 2
br i1 %12, label %13, label %4
13: ; preds = %11, %2, %15
%14 = phi double [ %17, %15 ], [ 1.000000e+00, %2 ], [ 1.000000e+00, %11 ]
ret double %14
15: ; preds = %4
%16 = tail call double @_myPow(double %9, i32 %10)
%17 = fmul double %6, %16
br label %13
}