long double mypow10(int exponent) {
  long double result = 1;
  while (exponent > 0) {
    result *= 10;
    exponent--;
  }
  while (exponent < 0) {
    result /= 10;
    exponent++;
  }
  return result;
}


x86 assembly (clang, -O0):
<mypow10>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
fld1
fstpt  -0x20(%rbp)
cmpl   $0x0,-0x4(%rbp)
jle    1132 <mypow10+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 <mypow10+0xc>
jmp    1137 <mypow10+0x37>
cmpl   $0x0,-0x4(%rbp)
jge    115d <mypow10+0x5d>
fldt   -0x20(%rbp)
flds   0xeb6(%rip)
fdivrp %st,%st(1)
fstpt  -0x20(%rbp)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1137 <mypow10+0x37>
fldt   -0x20(%rbp)
pop    %rbp
ret

x86 assembly (clang, -O2):
<mypow10>:
test   %edi,%edi
jle    1170 <mypow10+0x70>
lea    -0x1(%rdi),%eax
mov    %edi,%ecx
fldz
fld1
and    $0x7,%ecx
je     1133 <mypow10+0x33>
fstp   %st(1)
fstp   %st(0)
xor    %edx,%edx
fld1
nopw   0x0(%rax,%rax,1)
fmuls  0xeda(%rip)
add    $0x1,%edx
cmp    %edx,%ecx
jne    1120 <mypow10+0x20>
sub    %edx,%edi
fld    %st(0)
fxch   %st(1)
cmp    $0x7,%eax
fldz
jb     11e1 <mypow10+0xe1>
fstp   %st(2)
fstp   %st(1)
add    $0xffffffff,%edi
flds   0xeb5(%rip)
fldz
fxch   %st(1)
nop
fstp   %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)
fmul   %st,%st(1)
add    $0xfffffff8,%edi
cmp    $0xfffffffe,%edi
fldz
fxch   %st(1)
jb     1150 <mypow10+0x50>
jmp    11e1 <mypow10+0xe1>
fld1
fldz
fldz
jns    11e1 <mypow10+0xe1>
fstp   %st(2)
fstp   %st(0)
fstp   %st(0)
mov    %edi,%ecx
neg    %ecx
fld1
fldz
mov    %edi,%eax
and    $0x3,%ecx
je     11b5 <mypow10+0xb5>
fstp   %st(0)
fstp   %st(0)
neg    %ecx
fld1
xor    %edx,%edx
nopw   0x0(%rax,%rax,1)
fdivs  0xe5a(%rip)
add    $0xffffffff,%edx
cmp    %edx,%ecx
jne    11a0 <mypow10+0xa0>
mov    %edi,%eax
sub    %edx,%eax
fld    %st(0)
fxch   %st(1)
cmp    $0xfffffffc,%edi
fldz
fxch   %st(1)
fxch   %st(2)
ja     11e1 <mypow10+0xe1>
fstp   %st(2)
fstp   %st(0)
flds   0xe36(%rip)
fldz
nopl   0x0(%rax)
fstp   %st(0)
fdivr  %st,%st(1)
fdivr  %st,%st(1)
fdivr  %st,%st(1)
fdivr  %st,%st(1)
add    $0x4,%eax
fldz
jne    11d0 <mypow10+0xd0>
fstp   %st(1)
fstp   %st(0)
ret

LLVM IR (-O0):
define x86_fp80 @mypow10(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 sgt 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
br label %13
13: ; preds = %16, %12
%14 = load i32, i32* %2
%15 = icmp slt i32 %14, 0
br i1 %15, label %16, label %21
16: ; preds = %13
%17 = load x86_fp80, x86_fp80* %3
%18 = fdiv x86_fp80 %17, 0xK4002A000000000000000
store x86_fp80 %18, x86_fp80* %3
%19 = load i32, i32* %2
%20 = add nsw i32 %19, 1
store i32 %20, i32* %2
br label %13
21: ; preds = %13
%22 = load x86_fp80, x86_fp80* %3
ret x86_fp80 %22
}

LLVM IR (-O2):
define x86_fp80 @mypow10(i32 %0) {
%2 = icmp sgt i32 %0, 0
br i1 %2, label %3, label %20
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 [ 0xK3FFF8000000000000000, %3 ], [ %11, %7 ]
%17 = phi i32 [ %0, %3 ], [ %12, %7 ]
%18 = phi x86_fp80 [ undef, %3 ], [ %11, %7 ]
%19 = icmp ult i32 %4, 7
br i1 %19, label %62, label %39
20: ; preds = %1
%21 = icmp slt i32 %0, 0
br i1 %21, label %22, label %62
22: ; preds = %20
%23 = sub i32 0, %0
%24 = and i32 %23, 3
%25 = icmp eq i32 %24, 0
br i1 %25, label %34, label %26
26: ; preds = %22, %26
%27 = phi x86_fp80 [ %30, %26 ], [ 0xK3FFF8000000000000000, %22 ]
%28 = phi i32 [ %31, %26 ], [ %0, %22 ]
%29 = phi i32 [ %32, %26 ], [ 0, %22 ]
%30 = fdiv x86_fp80 %27, 0xK4002A000000000000000
%31 = add i32 %28, 1
%32 = add i32 %29, 1
%33 = icmp eq i32 %32, %24
br i1 %33, label %34, label %26
34: ; preds = %26, %22
%35 = phi x86_fp80 [ undef, %22 ], [ %30, %26 ]
%36 = phi x86_fp80 [ 0xK3FFF8000000000000000, %22 ], [ %30, %26 ]
%37 = phi i32 [ %0, %22 ], [ %31, %26 ]
%38 = icmp ugt i32 %0, -4
br i1 %38, label %62, label %53
39: ; preds = %15, %39
%40 = phi x86_fp80 [ %49, %39 ], [ %16, %15 ]
%41 = phi i32 [ %50, %39 ], [ %17, %15 ]
%42 = fmul x86_fp80 %40, 0xK4002A000000000000000
%43 = fmul x86_fp80 %42, 0xK4002A000000000000000
%44 = fmul x86_fp80 %43, 0xK4002A000000000000000
%45 = fmul x86_fp80 %44, 0xK4002A000000000000000
%46 = fmul x86_fp80 %45, 0xK4002A000000000000000
%47 = fmul x86_fp80 %46, 0xK4002A000000000000000
%48 = fmul x86_fp80 %47, 0xK4002A000000000000000
%49 = fmul x86_fp80 %48, 0xK4002A000000000000000
%50 = add nsw i32 %41, -8
%51 = add i32 %41, -9
%52 = icmp ult i32 %51, -2
br i1 %52, label %39, label %62
53: ; preds = %34, %53
%54 = phi x86_fp80 [ %59, %53 ], [ %36, %34 ]
%55 = phi i32 [ %60, %53 ], [ %37, %34 ]
%56 = fdiv x86_fp80 %54, 0xK4002A000000000000000
%57 = fdiv x86_fp80 %56, 0xK4002A000000000000000
%58 = fdiv x86_fp80 %57, 0xK4002A000000000000000
%59 = fdiv x86_fp80 %58, 0xK4002A000000000000000
%60 = add i32 %55, 4
%61 = icmp eq i32 %60, 0
br i1 %61, label %62, label %53
62: ; preds = %34, %53, %15, %39, %20
%63 = phi x86_fp80 [ 0xK3FFF8000000000000000, %20 ], [ %18, %15 ], [ %49, %39 ], [ %35, %34 ], [ %59, %53 ]
ret x86_fp80 %63
}