double Ten__9(int e) {
  double _o_result;
  double x, p;
  x = (double)1;
  p = (double)10;
  while (e > 0) {
    if (((e)&1)) {
      x = x * p;
    }
    e = ((long long)(e) >> (1));
    if (e > 0) {
      p = p * p;
    }
  }
  _o_result = x;
  return _o_result;
}


x86 assembly (clang, -O0):
<Ten__9>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movsd  0xef9(%rip),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xee4(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
cmpl   $0x0,-0x4(%rbp)
jle    1172 <Ten__9+0x72>
mov    -0x4(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1149 <Ten__9+0x49>
movsd  -0x18(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movslq -0x4(%rbp),%rax
sar    $0x1,%rax
mov    %eax,-0x4(%rbp)
cmpl   $0x0,-0x4(%rbp)
jle    116d <Ten__9+0x6d>
movsd  -0x20(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1121 <Ten__9+0x21>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<Ten__9>:
test   %edi,%edi
jle    114e <Ten__9+0x4e>
movsd  0xef4(%rip),%xmm1
movsd  0xef4(%rip),%xmm2
movapd %xmm1,%xmm0
jmp    112c <Ten__9+0x2c>
nopw   0x0(%rax,%rax,1)
mulsd  %xmm3,%xmm0
mulsd  %xmm4,%xmm2
mov    %eax,%edi
jbe    114d <Ten__9+0x4d>
movapd %xmm1,%xmm3
test   $0x1,%dil
je     113a <Ten__9+0x3a>
movapd %xmm2,%xmm3
mov    %edi,%eax
shr    %eax
movapd %xmm1,%xmm4
cmp    $0x1,%edi
je     1120 <Ten__9+0x20>
movapd %xmm2,%xmm4
jmp    1120 <Ten__9+0x20>
ret
movsd  0xeaa(%rip),%xmm0
ret

LLVM IR (-O0):
define double @Ten__9(i32 %0) {
%2 = alloca i32
%3 = alloca double
%4 = alloca double
%5 = alloca double
store i32 %0, i32* %2
store double 1.000000e+00, double* %4
store double 1.000000e+01, double* %5
br label %6
6: ; preds = %28, %1
%7 = load i32, i32* %2
%8 = icmp sgt i32 %7, 0
br i1 %8, label %9, label %29
9: ; preds = %6
%10 = load i32, i32* %2
%11 = and i32 %10, 1
%12 = icmp ne i32 %11, 0
br i1 %12, label %13, label %17
13: ; preds = %9
%14 = load double, double* %4
%15 = load double, double* %5
%16 = fmul double %14, %15
store double %16, double* %4
br label %17
17: ; preds = %13, %9
%18 = load i32, i32* %2
%19 = sext i32 %18 to i64
%20 = ashr i64 %19, 1
%21 = trunc i64 %20 to i32
store i32 %21, i32* %2
%22 = load i32, i32* %2
%23 = icmp sgt i32 %22, 0
br i1 %23, label %24, label %28
24: ; preds = %17
%25 = load double, double* %5
%26 = load double, double* %5
%27 = fmul double %25, %26
store double %27, double* %5
br label %28
28: ; preds = %24, %17
br label %6
29: ; preds = %6
%30 = load double, double* %4
store double %30, double* %3
%31 = load double, double* %3
ret double %31
}

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