long double POW10(int exp) {
  long double result = 1;
  while (exp) {
    result *= 10;
    exp--;
  }
  return result;
}


x86 assembly (clang, -O0):
<POW10>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
fld1
fstpt  -0x20(%rbp)
cmpl   $0x0,-0x4(%rbp)
je     1132 <POW10+0x32>
fldt   -0x20(%rbp)
flds   0xee1(%rip)
fmulp  %st,%st(1)
fstpt  -0x20(%rbp)
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
jmp    110c <POW10+0xc>
fldt   -0x20(%rbp)
pop    %rbp
ret

x86 assembly (clang, -O2):
<POW10>:
fld1
test   %edi,%edi
fldz
fldz
je     1179 <POW10+0x79>
fstp   %st(2)
fstp   %st(0)
fstp   %st(0)
lea    -0x1(%rdi),%eax
mov    %edi,%ecx
fld1
fldz
and    $0x7,%ecx
je     1143 <POW10+0x43>
fstp   %st(0)
fstp   %st(0)
xor    %edx,%edx
fld1
cs nopw 0x0(%rax,%rax,1)
fmuls  0xeca(%rip)
add    $0x1,%edx
cmp    %edx,%ecx
jne    1130 <POW10+0x30>
sub    %edx,%edi
fld    %st(0)
fxch   %st(1)
cmp    $0x7,%eax
fldz
fxch   %st(1)
fxch   %st(2)
jb     1179 <POW10+0x79>
fstp   %st(2)
fstp   %st(0)
flds   0xea8(%rip)
fldz
nopw   0x0(%rax,%rax,1)
fstp   %st(0)
fmul   %st,%st(1)
fmul   %st,%st(1)
fmul   %st,%st(1)
fmul   %st,%st(1)
fmul   %st,%st(1)
fmul   %st,%st(1)
fmul   %st,%st(1)
fmul   %st,%st(1)
add    $0xfffffff8,%edi
fldz
jne    1160 <POW10+0x60>
fstp   %st(1)
fstp   %st(0)
ret

LLVM IR (-O0):
define x86_fp80 @POW10(i32 %0) {
%2 = alloca i32
%3 = alloca x86_fp80
store i32 %0, i32* %2
store x86_fp80 0xK3FFF8000000000000000, x86_fp80* %3
br label %4
4: ; preds = %7, %1
%5 = load i32, i32* %2
%6 = icmp ne i32 %5, 0
br i1 %6, label %7, label %12
7: ; preds = %4
%8 = load x86_fp80, x86_fp80* %3
%9 = fmul x86_fp80 %8, 0xK4002A000000000000000
store x86_fp80 %9, x86_fp80* %3
%10 = load i32, i32* %2
%11 = add nsw i32 %10, -1
store i32 %11, i32* %2
br label %4
12: ; preds = %4
%13 = load x86_fp80, x86_fp80* %3
ret x86_fp80 %13
}

LLVM IR (-O2):
define x86_fp80 @POW10(i32 %0) {
%2 = icmp eq i32 %0, 0
br i1 %2, label %33, label %3
3: ; preds = %1
%4 = add i32 %0, -1
%5 = and i32 %0, 7
%6 = icmp eq i32 %5, 0
br i1 %6, label %15, label %7
7: ; preds = %3, %7
%8 = phi x86_fp80 [ %11, %7 ], [ 0xK3FFF8000000000000000, %3 ]
%9 = phi i32 [ %12, %7 ], [ %0, %3 ]
%10 = phi i32 [ %13, %7 ], [ 0, %3 ]
%11 = fmul x86_fp80 %8, 0xK4002A000000000000000
%12 = add nsw i32 %9, -1
%13 = add i32 %10, 1
%14 = icmp eq i32 %13, %5
br i1 %14, label %15, label %7
15: ; preds = %7, %3
%16 = phi x86_fp80 [ undef, %3 ], [ %11, %7 ]
%17 = phi x86_fp80 [ 0xK3FFF8000000000000000, %3 ], [ %11, %7 ]
%18 = phi i32 [ %0, %3 ], [ %12, %7 ]
%19 = icmp ult i32 %4, 7
br i1 %19, label %33, label %20
20: ; preds = %15, %20
%21 = phi x86_fp80 [ %30, %20 ], [ %17, %15 ]
%22 = phi i32 [ %31, %20 ], [ %18, %15 ]
%23 = fmul x86_fp80 %21, 0xK4002A000000000000000
%24 = fmul x86_fp80 %23, 0xK4002A000000000000000
%25 = fmul x86_fp80 %24, 0xK4002A000000000000000
%26 = fmul x86_fp80 %25, 0xK4002A000000000000000
%27 = fmul x86_fp80 %26, 0xK4002A000000000000000
%28 = fmul x86_fp80 %27, 0xK4002A000000000000000
%29 = fmul x86_fp80 %28, 0xK4002A000000000000000
%30 = fmul x86_fp80 %29, 0xK4002A000000000000000
%31 = add nsw i32 %22, -8
%32 = icmp eq i32 %31, 0
br i1 %32, label %33, label %20
33: ; preds = %15, %20, %1
%34 = phi x86_fp80 [ 0xK3FFF8000000000000000, %1 ], [ %16, %15 ], [ %30, %20 ]
ret x86_fp80 %34
}