int mtk_ftoa(float v, int prec, char *dst, int max_len) {
  int dig = 0, neg = 0, zero = 0;
  if (!dst)
    return -1;
  if (v < 0) {
    v = -v;
    dig++;
    neg = 1;
  }
  for (; (int)v > 0; v = v / 10.0)
    dig++;
  if (dig == 0) {
    dig = 1;
    zero = 1;
  }
  if (dig + prec + 2 > max_len) {
    prec = max_len - dig - 1;
    if (prec < 0) {
      *dst = 0;
      return -1;
    }
  }
  if (neg) {
    *(dst++) = '-';
    dig--;
  }
  if (zero) {
    *(dst++) = '0';
    dig--;
  }
  for (; dig-- > 0;) {
    v = v * 10;
    *(dst++) = '0' + (int)v;
    v = v - (int)v;
  }
  if (prec)
    *(dst++) = '.';
  for (; prec--;) {
    v = v * 10;
    *(dst++) = '0' + (int)v;
    v = v - (int)v;
  }
  *dst = 0;
  return 0;
}


x86 assembly (clang, -O0):
<mtk_ftoa>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    113f <mtk_ftoa+0x3f>
movl   $0xffffffff,-0x4(%rbp)
jmp    1342 <mtk_ftoa+0x242>
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    1173 <mtk_ftoa+0x73>
movss  -0x8(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x8(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
movl   $0x1,-0x24(%rbp)
jmp    1178 <mtk_ftoa+0x78>
cvttss2si -0x8(%rbp),%eax
cmp    $0x0,%eax
jle    11b2 <mtk_ftoa+0xb2>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe68(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    1178 <mtk_ftoa+0x78>
cmpl   $0x0,-0x20(%rbp)
jne    11ca <mtk_ftoa+0xca>
movl   $0x1,-0x20(%rbp)
movl   $0x1,-0x28(%rbp)
mov    -0x20(%rbp),%eax
add    -0xc(%rbp),%eax
add    $0x2,%eax
cmp    -0x1c(%rbp),%eax
jle    120a <mtk_ftoa+0x10a>
mov    -0x1c(%rbp),%eax
sub    -0x20(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0xc(%rbp)
cmpl   $0x0,-0xc(%rbp)
jge    1205 <mtk_ftoa+0x105>
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
movl   $0xffffffff,-0x4(%rbp)
jmp    1342 <mtk_ftoa+0x242>
jmp    120a <mtk_ftoa+0x10a>
cmpl   $0x0,-0x24(%rbp)
je     122f <mtk_ftoa+0x12f>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x2d,(%rax)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x28(%rbp)
je     1254 <mtk_ftoa+0x154>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x30,(%rax)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    1259 <mtk_ftoa+0x159>
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x20(%rbp)
cmp    $0x0,%eax
jle    12b6 <mtk_ftoa+0x1b6>
movss  0xd8b(%rip),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
cvttss2si -0x8(%rbp),%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
movss  -0x8(%rbp),%xmm0
cvttss2si -0x8(%rbp),%eax
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    1259 <mtk_ftoa+0x159>
cmpl   $0x0,-0xc(%rbp)
je     12d2 <mtk_ftoa+0x1d2>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x2e,(%rax)
jmp    12d7 <mtk_ftoa+0x1d7>
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0xc(%rbp)
cmp    $0x0,%eax
je     1334 <mtk_ftoa+0x234>
movss  0xd0d(%rip),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
cvttss2si -0x8(%rbp),%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
movss  -0x8(%rbp),%xmm0
cvttss2si -0x8(%rbp),%eax
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    12d7 <mtk_ftoa+0x1d7>
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<mtk_ftoa>:
test   %rsi,%rsi
je     1117 <mtk_ftoa+0x17>
xorps  %xmm1,%xmm1
xor    %ecx,%ecx
ucomiss %xmm0,%xmm1
seta   %al
ja     111d <mtk_ftoa+0x1d>
movaps %xmm0,%xmm1
jmp    1127 <mtk_ftoa+0x27>
mov    $0xffffffff,%eax
ret
movaps 0xedc(%rip),%xmm1
xorps  %xmm0,%xmm1
mov    %al,%cl
cvttss2si %xmm1,%eax
test   %eax,%eax
jle    114f <mtk_ftoa+0x4f>
movss  0xed7(%rip),%xmm2
nopl   0x0(%rax)
add    $0x1,%ecx
divss  %xmm2,%xmm1
cvttss2si %xmm1,%eax
test   %eax,%eax
jg     1140 <mtk_ftoa+0x40>
test   %ecx,%ecx
mov    $0x1,%r8d
cmovne %ecx,%r8d
lea    (%rdi,%r8,1),%eax
add    $0x2,%eax
cmp    %edx,%eax
jle    1173 <mtk_ftoa+0x73>
mov    %r8d,%edi
not    %edi
add    %edx,%edi
js     12d0 <mtk_ftoa+0x1d0>
xorps  %xmm2,%xmm2
ucomiss %xmm0,%xmm2
ja     1189 <mtk_ftoa+0x89>
test   %ecx,%ecx
je     1198 <mtk_ftoa+0x98>
test   %r8d,%r8d
jg     11ac <mtk_ftoa+0xac>
jmp    1239 <mtk_ftoa+0x139>
movb   $0x2d,(%rsi)
add    $0x1,%rsi
add    $0xffffffff,%r8d
test   %ecx,%ecx
jne    117f <mtk_ftoa+0x7f>
movb   $0x30,(%rsi)
add    $0x1,%rsi
add    $0xffffffff,%r8d
test   %r8d,%r8d
jle    1239 <mtk_ftoa+0x139>
test   $0x1,%r8b
jne    11bd <mtk_ftoa+0xbd>
mov    %r8d,%ecx
cmp    $0x1,%r8d
jne    11e6 <mtk_ftoa+0xe6>
jmp    1239 <mtk_ftoa+0x139>
lea    -0x1(%r8),%ecx
mulss  0xe47(%rip),%xmm1
cvttss2si %xmm1,%eax
add    $0x30,%al
mov    %al,(%rsi)
add    $0x1,%rsi
cvttps2dq %xmm1,%xmm0
cvtdq2ps %xmm0,%xmm0
subss  %xmm0,%xmm1
cmp    $0x1,%r8d
je     1239 <mtk_ftoa+0x139>
add    $0xffffffff,%ecx
movss  0xe1f(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mulss  %xmm0,%xmm1
cvttss2si %xmm1,%eax
add    $0x30,%al
cvttps2dq %xmm1,%xmm2
cvtdq2ps %xmm2,%xmm2
subss  %xmm2,%xmm1
mulss  %xmm0,%xmm1
cvttss2si %xmm1,%edx
mov    %al,(%rsi)
add    $0x30,%dl
mov    %dl,0x1(%rsi)
add    $0x2,%rsi
cvttps2dq %xmm1,%xmm2
cvtdq2ps %xmm2,%xmm2
subss  %xmm2,%xmm1
add    $0xfffffffe,%ecx
jb     1200 <mtk_ftoa+0x100>
xor    %eax,%eax
test   %edi,%edi
je     12cc <mtk_ftoa+0x1cc>
movb   $0x2e,(%rsi)
test   $0x1,%dil
jne    1259 <mtk_ftoa+0x159>
add    $0x1,%rsi
mov    %edi,%ecx
cmp    $0x1,%edi
jne    1282 <mtk_ftoa+0x182>
jmp    12cc <mtk_ftoa+0x1cc>
lea    -0x1(%rdi),%ecx
mulss  0xdac(%rip),%xmm1
cvttss2si %xmm1,%edx
add    $0x30,%dl
mov    %dl,0x1(%rsi)
add    $0x2,%rsi
cvttps2dq %xmm1,%xmm0
cvtdq2ps %xmm0,%xmm0
subss  %xmm0,%xmm1
cmp    $0x1,%edi
je     12cc <mtk_ftoa+0x1cc>
movss  0xd86(%rip),%xmm0
nopw   0x0(%rax,%rax,1)
mulss  %xmm0,%xmm1
cvttss2si %xmm1,%edx
add    $0x30,%dl
cvttps2dq %xmm1,%xmm2
cvtdq2ps %xmm2,%xmm2
subss  %xmm2,%xmm1
mulss  %xmm0,%xmm1
cvttss2si %xmm1,%edi
mov    %dl,(%rsi)
add    $0x30,%dil
mov    %dil,0x1(%rsi)
add    $0x2,%rsi
cvttps2dq %xmm1,%xmm2
cvtdq2ps %xmm2,%xmm2
subss  %xmm2,%xmm1
add    $0xfffffffe,%ecx
jne    1290 <mtk_ftoa+0x190>
movb   $0x0,(%rsi)
ret
mov    $0xffffffff,%eax
movb   $0x0,(%rsi)
ret

LLVM IR (-O0):
define i32 @mtk_ftoa(float %0, i32 %1, i8* %2, i32 %3) {
%5 = alloca i32
%6 = alloca float
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
store float %0, float* %6
store i32 %1, i32* %7
store i8* %2, i8** %8
store i32 %3, i32* %9
store i32 0, i32* %10
store i32 0, i32* %11
store i32 0, i32* %12
%13 = load i8*, i8** %8
%14 = icmp ne i8* %13, null
br i1 %14, label %16, label %15
15: ; preds = %4
store i32 -1, i32* %5
br label %120
16: ; preds = %4
%17 = load float, float* %6
%18 = fcmp olt float %17, 0.000000e+00
br i1 %18, label %19, label %24
19: ; preds = %16
%20 = load float, float* %6
%21 = fneg float %20
store float %21, float* %6
%22 = load i32, i32* %10
%23 = add nsw i32 %22, 1
store i32 %23, i32* %10
store i32 1, i32* %11
br label %24
24: ; preds = %19, %16
br label %25
25: ; preds = %32, %24
%26 = load float, float* %6
%27 = fptosi float %26 to i32
%28 = icmp sgt i32 %27, 0
br i1 %28, label %29, label %37
29: ; preds = %25
%30 = load i32, i32* %10
%31 = add nsw i32 %30, 1
store i32 %31, i32* %10
br label %32
32: ; preds = %29
%33 = load float, float* %6
%34 = fpext float %33 to double
%35 = fdiv double %34, 1.000000e+01
%36 = fptrunc double %35 to float
store float %36, float* %6
br label %25
37: ; preds = %25
%38 = load i32, i32* %10
%39 = icmp eq i32 %38, 0
br i1 %39, label %40, label %41
40: ; preds = %37
store i32 1, i32* %10
store i32 1, i32* %12
br label %41
41: ; preds = %40, %37
%42 = load i32, i32* %10
%43 = load i32, i32* %7
%44 = add nsw i32 %42, %43
%45 = add nsw i32 %44, 2
%46 = load i32, i32* %9
%47 = icmp sgt i32 %45, %46
br i1 %47, label %48, label %58
48: ; preds = %41
%49 = load i32, i32* %9
%50 = load i32, i32* %10
%51 = sub nsw i32 %49, %50
%52 = sub nsw i32 %51, 1
store i32 %52, i32* %7
%53 = load i32, i32* %7
%54 = icmp slt i32 %53, 0
br i1 %54, label %55, label %57
55: ; preds = %48
%56 = load i8*, i8** %8
store i8 0, i8* %56
store i32 -1, i32* %5
br label %120
57: ; preds = %48
br label %58
58: ; preds = %57, %41
%59 = load i32, i32* %11
%60 = icmp ne i32 %59, 0
br i1 %60, label %61, label %66
61: ; preds = %58
%62 = load i8*, i8** %8
%63 = getelementptr inbounds i8, i8* %62, i32 1
store i8* %63, i8** %8
store i8 45, i8* %62
%64 = load i32, i32* %10
%65 = add nsw i32 %64, -1
store i32 %65, i32* %10
br label %66
66: ; preds = %61, %58
%67 = load i32, i32* %12
%68 = icmp ne i32 %67, 0
br i1 %68, label %69, label %74
69: ; preds = %66
%70 = load i8*, i8** %8
%71 = getelementptr inbounds i8, i8* %70, i32 1
store i8* %71, i8** %8
store i8 48, i8* %70
%72 = load i32, i32* %10
%73 = add nsw i32 %72, -1
store i32 %73, i32* %10
br label %74
74: ; preds = %69, %66
br label %75
75: ; preds = %79, %74
%76 = load i32, i32* %10
%77 = add nsw i32 %76, -1
store i32 %77, i32* %10
%78 = icmp sgt i32 %76, 0
br i1 %78, label %79, label %93
79: ; preds = %75
%80 = load float, float* %6
%81 = fmul float %80, 1.000000e+01
store float %81, float* %6
%82 = load float, float* %6
%83 = fptosi float %82 to i32
%84 = add nsw i32 48, %83
%85 = trunc i32 %84 to i8
%86 = load i8*, i8** %8
%87 = getelementptr inbounds i8, i8* %86, i32 1
store i8* %87, i8** %8
store i8 %85, i8* %86
%88 = load float, float* %6
%89 = load float, float* %6
%90 = fptosi float %89 to i32
%91 = sitofp i32 %90 to float
%92 = fsub float %88, %91
store float %92, float* %6
br label %75
93: ; preds = %75
%94 = load i32, i32* %7
%95 = icmp ne i32 %94, 0
br i1 %95, label %96, label %99
96: ; preds = %93
%97 = load i8*, i8** %8
%98 = getelementptr inbounds i8, i8* %97, i32 1
store i8* %98, i8** %8
store i8 46, i8* %97
br label %99
99: ; preds = %96, %93
br label %100
100: ; preds = %104, %99
%101 = load i32, i32* %7
%102 = add nsw i32 %101, -1
store i32 %102, i32* %7
%103 = icmp ne i32 %101, 0
br i1 %103, label %104, label %118
104: ; preds = %100
%105 = load float, float* %6
%106 = fmul float %105, 1.000000e+01
store float %106, float* %6
%107 = load float, float* %6
%108 = fptosi float %107 to i32
%109 = add nsw i32 48, %108
%110 = trunc i32 %109 to i8
%111 = load i8*, i8** %8
%112 = getelementptr inbounds i8, i8* %111, i32 1
store i8* %112, i8** %8
store i8 %110, i8* %111
%113 = load float, float* %6
%114 = load float, float* %6
%115 = fptosi float %114 to i32
%116 = sitofp i32 %115 to float
%117 = fsub float %113, %116
store float %117, float* %6
br label %100
118: ; preds = %100
%119 = load i8*, i8** %8
store i8 0, i8* %119
store i32 0, i32* %5
br label %120
120: ; preds = %118, %55, %15
%121 = load i32, i32* %5
ret i32 %121
}

LLVM IR (-O2):
define i32 @mtk_ftoa(float %0, i32 %1, i8* writeonly %2, i32 %3) {
%5 = icmp eq i8* %2, null
br i1 %5, label %133, label %6
6: ; preds = %4
%7 = fcmp olt float %0, 0.000000e+00
%8 = fneg float %0
%9 = select i1 %7, float %8, float %0
%10 = zext i1 %7 to i32
%11 = fptosi float %9 to i32
%12 = icmp sgt i32 %11, 0
br i1 %12, label %13, label %20
13: ; preds = %6, %13
%14 = phi i32 [ %16, %13 ], [ %10, %6 ]
%15 = phi float [ %17, %13 ], [ %9, %6 ]
%16 = add nuw nsw i32 %14, 1
%17 = fdiv float %15, 1.000000e+01
%18 = fptosi float %17 to i32
%19 = icmp sgt i32 %18, 0
br i1 %19, label %13, label %20
20: ; preds = %13, %6
%21 = phi float [ %9, %6 ], [ %17, %13 ]
%22 = phi i32 [ %10, %6 ], [ %16, %13 ]
%23 = icmp eq i32 %22, 0
%24 = select i1 %23, i32 1, i32 %22
%25 = add i32 %1, 2
%26 = add i32 %25, %24
%27 = icmp sgt i32 %26, %3
br i1 %27, label %28, label %32
28: ; preds = %20
%29 = xor i32 %24, -1
%30 = add i32 %29, %3
%31 = icmp slt i32 %30, 0
br i1 %31, label %130, label %32
32: ; preds = %28, %20
%33 = phi i32 [ %30, %28 ], [ %1, %20 ]
br i1 %7, label %34, label %37
34: ; preds = %32
%35 = getelementptr inbounds i8, i8* %2, i64 1
store i8 45, i8* %2
%36 = add nsw i32 %24, -1
br label %37
37: ; preds = %34, %32
%38 = phi i8* [ %35, %34 ], [ %2, %32 ]
%39 = phi i32 [ %36, %34 ], [ %24, %32 ]
br i1 %23, label %40, label %43
40: ; preds = %37
%41 = getelementptr inbounds i8, i8* %38, i64 1
store i8 48, i8* %38
%42 = add nsw i32 %39, -1
br label %43
43: ; preds = %40, %37
%44 = phi i8* [ %41, %40 ], [ %38, %37 ]
%45 = phi i32 [ %42, %40 ], [ %39, %37 ]
%46 = icmp sgt i32 %45, 0
br i1 %46, label %47, label %87
47: ; preds = %43
%48 = and i32 %45, 1
%49 = icmp eq i32 %48, 0
br i1 %49, label %59, label %50
50: ; preds = %47
%51 = add nsw i32 %45, -1
%52 = fmul float %21, 1.000000e+01
%53 = fptosi float %52 to i32
%54 = trunc i32 %53 to i8
%55 = add i8 %54, 48
%56 = getelementptr inbounds i8, i8* %44, i64 1
store i8 %55, i8* %44
%57 = sitofp i32 %53 to float
%58 = fsub float %52, %57
br label %59
59: ; preds = %50, %47
%60 = phi i32 [ %45, %47 ], [ %51, %50 ]
%61 = phi i8* [ %44, %47 ], [ %56, %50 ]
%62 = phi float [ %21, %47 ], [ %58, %50 ]
%63 = phi i8* [ undef, %47 ], [ %56, %50 ]
%64 = phi float [ undef, %47 ], [ %58, %50 ]
%65 = icmp eq i32 %45, 1
br i1 %65, label %87, label %66
66: ; preds = %59, %66
%67 = phi i32 [ %77, %66 ], [ %60, %59 ]
%68 = phi i8* [ %82, %66 ], [ %61, %59 ]
%69 = phi float [ %84, %66 ], [ %62, %59 ]
%70 = fmul float %69, 1.000000e+01
%71 = fptosi float %70 to i32
%72 = trunc i32 %71 to i8
%73 = add i8 %72, 48
%74 = getelementptr inbounds i8, i8* %68, i64 1
store i8 %73, i8* %68
%75 = sitofp i32 %71 to float
%76 = fsub float %70, %75
%77 = add nsw i32 %67, -2
%78 = fmul float %76, 1.000000e+01
%79 = fptosi float %78 to i32
%80 = trunc i32 %79 to i8
%81 = add i8 %80, 48
%82 = getelementptr inbounds i8, i8* %68, i64 2
store i8 %81, i8* %74
%83 = sitofp i32 %79 to float
%84 = fsub float %78, %83
%85 = add i32 %67, -3
%86 = icmp ult i32 %85, -2
br i1 %86, label %66, label %87
87: ; preds = %59, %66, %43
%88 = phi float [ %21, %43 ], [ %64, %59 ], [ %84, %66 ]
%89 = phi i8* [ %44, %43 ], [ %63, %59 ], [ %82, %66 ]
%90 = icmp eq i32 %33, 0
br i1 %90, label %130, label %91
91: ; preds = %87
%92 = getelementptr inbounds i8, i8* %89, i64 1
store i8 46, i8* %89
%93 = and i32 %33, 1
%94 = icmp eq i32 %93, 0
br i1 %94, label %104, label %95
95: ; preds = %91
%96 = add nsw i32 %33, -1
%97 = fmul float %88, 1.000000e+01
%98 = fptosi float %97 to i32
%99 = trunc i32 %98 to i8
%100 = add i8 %99, 48
%101 = getelementptr inbounds i8, i8* %89, i64 2
store i8 %100, i8* %92
%102 = sitofp i32 %98 to float
%103 = fsub float %97, %102
br label %104
104: ; preds = %95, %91
%105 = phi i8* [ undef, %91 ], [ %101, %95 ]
%106 = phi i8* [ %92, %91 ], [ %101, %95 ]
%107 = phi i32 [ %33, %91 ], [ %96, %95 ]
%108 = phi float [ %88, %91 ], [ %103, %95 ]
%109 = icmp eq i32 %33, 1
br i1 %109, label %130, label %110
110: ; preds = %104, %110
%111 = phi i8* [ %126, %110 ], [ %106, %104 ]
%112 = phi i32 [ %121, %110 ], [ %107, %104 ]
%113 = phi float [ %128, %110 ], [ %108, %104 ]
%114 = fmul float %113, 1.000000e+01
%115 = fptosi float %114 to i32
%116 = trunc i32 %115 to i8
%117 = add i8 %116, 48
%118 = getelementptr inbounds i8, i8* %111, i64 1
store i8 %117, i8* %111
%119 = sitofp i32 %115 to float
%120 = fsub float %114, %119
%121 = add nsw i32 %112, -2
%122 = fmul float %120, 1.000000e+01
%123 = fptosi float %122 to i32
%124 = trunc i32 %123 to i8
%125 = add i8 %124, 48
%126 = getelementptr inbounds i8, i8* %111, i64 2
store i8 %125, i8* %118
%127 = sitofp i32 %123 to float
%128 = fsub float %122, %127
%129 = icmp eq i32 %121, 0
br i1 %129, label %130, label %110
130: ; preds = %104, %110, %87, %28
%131 = phi i8* [ %2, %28 ], [ %89, %87 ], [ %105, %104 ], [ %126, %110 ]
%132 = phi i32 [ -1, %28 ], [ 0, %87 ], [ 0, %110 ], [ 0, %104 ]
store i8 0, i8* %131
br label %133
133: ; preds = %130, %4
%134 = phi i32 [ -1, %4 ], [ %132, %130 ]
ret i32 %134
}