float Math_FloatPower10(int Power) {
  int i;
  float TmpFloat = 1;
  if (Power >= 0)
    for (i = 0; i < Power; i++)
      TmpFloat *= 10;
  else
    for (i = 0; i < -Power; i++)
      TmpFloat *= 0.1;
  return TmpFloat;
}


x86 assembly (clang, -O0):
<Math_FloatPower10>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movss  0xef1(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
cmpl   $0x0,-0x4(%rbp)
jl     1156 <Math_FloatPower10+0x56>
movl   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1151 <Math_FloatPower10+0x51>
movss  0xecb(%rip),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1125 <Math_FloatPower10+0x25>
jmp    119e <Math_FloatPower10+0x9e>
movl   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%eax
xor    %ecx,%ecx
sub    -0x4(%rbp),%ecx
cmp    %ecx,%eax
jge    1199 <Math_FloatPower10+0x99>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe8a(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    115d <Math_FloatPower10+0x5d>
jmp    119e <Math_FloatPower10+0x9e>
movss  -0xc(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<Math_FloatPower10>:
test   %edi,%edi
js     111d <Math_FloatPower10+0x1d>
je     1144 <Math_FloatPower10+0x44>
lea    -0x1(%rdi),%ecx
mov    %edi,%eax
and    $0x7,%eax
cmp    $0x7,%ecx
jae    114d <Math_FloatPower10+0x4d>
movss  0xee5(%rip),%xmm0
jmp    1185 <Math_FloatPower10+0x85>
neg    %edi
cmp    $0x2,%edi
mov    $0x1,%ecx
cmovge %edi,%ecx
lea    -0x1(%rcx),%edx
mov    %ecx,%eax
and    $0x3,%eax
cmp    $0x3,%edx
jae    11ae <Math_FloatPower10+0xae>
movss  0xec1(%rip),%xmm0
jmp    1205 <Math_FloatPower10+0x105>
movss  0xeb4(%rip),%xmm0
ret
and    $0xfffffff8,%edi
movss  0xea8(%rip),%xmm0
movss  0xea4(%rip),%xmm1
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
add    $0xfffffff8,%edi
jne    1160 <Math_FloatPower10+0x60>
test   %eax,%eax
je     1231 <Math_FloatPower10+0x131>
movss  0xe6f(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nop
mulss  %xmm1,%xmm0
add    $0xffffffff,%eax
jne    11a0 <Math_FloatPower10+0xa0>
jmp    1231 <Math_FloatPower10+0x131>
and    $0x7ffffffc,%ecx
movss  0xe44(%rip),%xmm0
movsd  0xe44(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
cvtss2sd %xmm0,%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
add    $0xfffffffc,%ecx
jne    11d0 <Math_FloatPower10+0xd0>
test   %eax,%eax
je     1231 <Math_FloatPower10+0x131>
movsd  0xdf7(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
cvtss2sd %xmm0,%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
add    $0xffffffff,%eax
jne    1220 <Math_FloatPower10+0x120>
ret

LLVM IR (-O0):
define float @Math_FloatPower10(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca float
store i32 %0, i32* %2
store float 1.000000e+00, float* %4
%5 = load i32, i32* %2
%6 = icmp sge i32 %5, 0
br i1 %6, label %7, label %19
7: ; preds = %1
store i32 0, i32* %3
br label %8
8: ; preds = %15, %7
%9 = load i32, i32* %3
%10 = load i32, i32* %2
%11 = icmp slt i32 %9, %10
br i1 %11, label %12, label %18
12: ; preds = %8
%13 = load float, float* %4
%14 = fmul float %13, 1.000000e+01
store float %14, float* %4
br label %15
15: ; preds = %12
%16 = load i32, i32* %3
%17 = add nsw i32 %16, 1
store i32 %17, i32* %3
br label %8
18: ; preds = %8
br label %34
19: ; preds = %1
store i32 0, i32* %3
br label %20
20: ; preds = %30, %19
%21 = load i32, i32* %3
%22 = load i32, i32* %2
%23 = sub nsw i32 0, %22
%24 = icmp slt i32 %21, %23
br i1 %24, label %25, label %33
25: ; preds = %20
%26 = load float, float* %4
%27 = fpext float %26 to double
%28 = fmul double %27, 1.000000e-01
%29 = fptrunc double %28 to float
store float %29, float* %4
br label %30
30: ; preds = %25
%31 = load i32, i32* %3
%32 = add nsw i32 %31, 1
store i32 %32, i32* %3
br label %20
33: ; preds = %20
br label %34
34: ; preds = %33, %18
%35 = load float, float* %4
ret float %35
}

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