double powerOfTen(int num) {
  double rst = 1.0;
  if (num >= 0) {
    while (num-- > 0)
      rst *= 10;
  } else {
    num = -num;
    while (num--)
      rst *= 0.1;
  }
  return rst;
}


x86 assembly (clang, -O0):
<powerOfTen>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movsd  0xef1(%rip),%xmm0
movsd  %xmm0,-0x10(%rbp)
cmpl   $0x0,-0x4(%rbp)
jl     1153 <powerOfTen+0x53>
jmp    1123 <powerOfTen+0x23>
mov    -0x4(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x4(%rbp)
cmp    $0x0,%eax
jle    114e <powerOfTen+0x4e>
movsd  0xed1(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    1123 <powerOfTen+0x23>
jmp    118b <powerOfTen+0x8b>
xor    %eax,%eax
sub    -0x4(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x4(%rbp)
cmp    $0x0,%eax
je     1186 <powerOfTen+0x86>
movsd  0xe91(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    115b <powerOfTen+0x5b>
jmp    118b <powerOfTen+0x8b>
movsd  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<powerOfTen>:
test   %edi,%edi
js     1147 <powerOfTen+0x47>
je     1187 <powerOfTen+0x87>
lea    -0x1(%rdi),%eax
mov    %edi,%ecx
and    $0x7,%ecx
je     1190 <powerOfTen+0x90>
xor    %edx,%edx
movsd  0xede(%rip),%xmm0
movsd  0xee6(%rip),%xmm1
nopw   0x0(%rax,%rax,1)
mulsd  %xmm1,%xmm0
add    $0x1,%edx
cmp    %edx,%ecx
jne    1130 <powerOfTen+0x30>
sub    %edx,%edi
cmp    $0x7,%eax
jae    119d <powerOfTen+0x9d>
jmp    1215 <powerOfTen+0x115>
mov    %edi,%eax
neg    %eax
mov    %eax,%ecx
and    $0x7,%ecx
je     11da <powerOfTen+0xda>
xor    %edx,%edx
movsd  0xea0(%rip),%xmm0
movsd  0xea0(%rip),%xmm1
nopl   0x0(%rax,%rax,1)
mulsd  %xmm1,%xmm0
add    $0x1,%edx
cmp    %edx,%ecx
jne    1170 <powerOfTen+0x70>
sub    %edx,%eax
cmp    $0xfffffff8,%edi
jbe    11e7 <powerOfTen+0xe7>
jmp    1215 <powerOfTen+0x115>
movsd  0xe71(%rip),%xmm0
ret
movsd  0xe68(%rip),%xmm0
cmp    $0x7,%eax
jb     1215 <powerOfTen+0x115>
add    $0xffffffff,%edi
movsd  0xe68(%rip),%xmm1
nopl   0x0(%rax,%rax,1)
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
add    $0xfffffff8,%edi
cmp    $0xfffffffe,%edi
jb     11b0 <powerOfTen+0xb0>
jmp    1215 <powerOfTen+0x115>
movsd  0xe1e(%rip),%xmm0
cmp    $0xfffffff8,%edi
ja     1215 <powerOfTen+0x115>
movsd  0xe19(%rip),%xmm1
nop
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
add    $0xfffffff8,%eax
jne    11f0 <powerOfTen+0xf0>
ret

LLVM IR (-O0):
define double @powerOfTen(i32 %0) {
%2 = alloca i32
%3 = alloca double
store i32 %0, i32* %2
store double 1.000000e+00, double* %3
%4 = load i32, i32* %2
%5 = icmp sge i32 %4, 0
br i1 %5, label %6, label %15
6: ; preds = %1
br label %7
7: ; preds = %11, %6
%8 = load i32, i32* %2
%9 = add nsw i32 %8, -1
store i32 %9, i32* %2
%10 = icmp sgt i32 %8, 0
br i1 %10, label %11, label %14
11: ; preds = %7
%12 = load double, double* %3
%13 = fmul double %12, 1.000000e+01
store double %13, double* %3
br label %7
14: ; preds = %7
br label %26
15: ; preds = %1
%16 = load i32, i32* %2
%17 = sub nsw i32 0, %16
store i32 %17, i32* %2
br label %18
18: ; preds = %22, %15
%19 = load i32, i32* %2
%20 = add nsw i32 %19, -1
store i32 %20, i32* %2
%21 = icmp ne i32 %19, 0
br i1 %21, label %22, label %25
22: ; preds = %18
%23 = load double, double* %3
%24 = fmul double %23, 1.000000e-01
store double %24, double* %3
br label %18
25: ; preds = %18
br label %26
26: ; preds = %25, %14
%27 = load double, double* %3
ret double %27
}

LLVM IR (-O2):
define double @powerOfTen(i32 %0) {
%2 = icmp sgt i32 %0, -1
br i1 %2, label %3, label %36
3: ; preds = %1
%4 = icmp eq i32 %0, 0
br i1 %4, label %66, label %5
5: ; preds = %3
%6 = add i32 %0, -1
%7 = and i32 %0, 7
%8 = icmp eq i32 %7, 0
br i1 %8, label %17, label %9
9: ; preds = %5, %9
%10 = phi double [ %14, %9 ], [ 1.000000e+00, %5 ]
%11 = phi i32 [ %13, %9 ], [ %0, %5 ]
%12 = phi i32 [ %15, %9 ], [ 0, %5 ]
%13 = add nsw i32 %11, -1
%14 = fmul double %10, 1.000000e+01
%15 = add i32 %12, 1
%16 = icmp eq i32 %15, %7
br i1 %16, label %17, label %9
17: ; preds = %9, %5
%18 = phi double [ 1.000000e+00, %5 ], [ %14, %9 ]
%19 = phi i32 [ %0, %5 ], [ %13, %9 ]
%20 = phi double [ undef, %5 ], [ %14, %9 ]
%21 = icmp ult i32 %6, 7
br i1 %21, label %66, label %22
22: ; preds = %17, %22
%23 = phi double [ %33, %22 ], [ %18, %17 ]
%24 = phi i32 [ %32, %22 ], [ %19, %17 ]
%25 = fmul double %23, 1.000000e+01
%26 = fmul double %25, 1.000000e+01
%27 = fmul double %26, 1.000000e+01
%28 = fmul double %27, 1.000000e+01
%29 = fmul double %28, 1.000000e+01
%30 = fmul double %29, 1.000000e+01
%31 = fmul double %30, 1.000000e+01
%32 = add nsw i32 %24, -8
%33 = fmul double %31, 1.000000e+01
%34 = add i32 %24, -9
%35 = icmp ult i32 %34, -2
br i1 %35, label %22, label %66
36: ; preds = %1
%37 = sub i32 0, %0
%38 = and i32 %37, 7
%39 = icmp eq i32 %38, 0
br i1 %39, label %48, label %40
40: ; preds = %36, %40
%41 = phi double [ %45, %40 ], [ 1.000000e+00, %36 ]
%42 = phi i32 [ %44, %40 ], [ %37, %36 ]
%43 = phi i32 [ %46, %40 ], [ 0, %36 ]
%44 = add nsw i32 %42, -1
%45 = fmul double %41, 1.000000e-01
%46 = add i32 %43, 1
%47 = icmp eq i32 %46, %38
br i1 %47, label %48, label %40
48: ; preds = %40, %36
%49 = phi double [ undef, %36 ], [ %45, %40 ]
%50 = phi double [ 1.000000e+00, %36 ], [ %45, %40 ]
%51 = phi i32 [ %37, %36 ], [ %44, %40 ]
%52 = icmp ugt i32 %0, -8
br i1 %52, label %66, label %53
53: ; preds = %48, %53
%54 = phi double [ %64, %53 ], [ %50, %48 ]
%55 = phi i32 [ %63, %53 ], [ %51, %48 ]
%56 = fmul double %54, 1.000000e-01
%57 = fmul double %56, 1.000000e-01
%58 = fmul double %57, 1.000000e-01
%59 = fmul double %58, 1.000000e-01
%60 = fmul double %59, 1.000000e-01
%61 = fmul double %60, 1.000000e-01
%62 = fmul double %61, 1.000000e-01
%63 = add nsw i32 %55, -8
%64 = fmul double %62, 1.000000e-01
%65 = icmp eq i32 %63, 0
br i1 %65, label %66, label %53
66: ; preds = %48, %53, %17, %22, %3
%67 = phi double [ 1.000000e+00, %3 ], [ %20, %17 ], [ %33, %22 ], [ %49, %48 ], [ %64, %53 ]
ret double %67
}