#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int log10(float);
int /*<<< orphan*/ ltoa(int, char *);
float pow(double, double);
void ftoa(float fval, char *buf) {
  int index = 0, count, exponent;
  double temp1, temp2;
  if (fval < 0) {
    buf[index++] = '-';
    fval = -fval;
  }
  exponent = fval != 0.0 ? log10(fval) : 0;
  fval /= pow((double)10.0, (double)exponent);
  if ((fval > -1.0) && (fval < 1.0) && (fval != 0.0)) {
    fval *= 10;
    exponent--;
    buf[index++] = '0' + (int)fval;
    fval -= (int)fval;
    buf[index++] = '.';
  } else {
    buf[index++] = '0' + (int)fval;
    fval -= (int)fval;
    buf[index++] = '.';
  }
  for (count = 0; count < 4; count++) {
    fval *= 10;
    buf[index++] = '0' + (int)fval;
    fval -= (int)fval;
  }
  if (exponent) {
    buf[index++] = 'x';
    buf[index++] = '1';
    buf[index++] = '0';
    buf[index++] = 'e';
    ltoa(exponent, buf + index);
  } else {
    buf[index] = '\0';
  }
}


x86 assembly (clang, -O0):
<ftoa>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movss  %xmm0,-0x4(%rbp)
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x4(%rbp),%xmm0
jbe    1182 <ftoa+0x52>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x14(%rbp)
movslq %ecx,%rcx
movb   $0x2d,(%rax,%rcx,1)
movss  -0x4(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11a3 <ftoa+0x73>
jp     11a3 <ftoa+0x73>
jmp    11b5 <ftoa+0x85>
movss  -0x4(%rbp),%xmm0
call   1050 <log10@plt>
mov    %eax,-0x34(%rbp)
jmp    11bf <ftoa+0x8f>
xor    %eax,%eax
mov    %eax,-0x34(%rbp)
jmp    11bf <ftoa+0x8f>
mov    -0x34(%rbp),%eax
mov    %eax,-0x1c(%rbp)
cvtsi2sdl -0x1c(%rbp),%xmm1
movsd  0xe36(%rip),%xmm0
call   1040 <pow@plt>
movaps %xmm0,%xmm1
movss  -0x4(%rbp),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe07(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    12ab <ftoa+0x17b>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xdfc(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    12ab <ftoa+0x17b>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    123f <ftoa+0x10f>
jp     123f <ftoa+0x10f>
jmp    12ab <ftoa+0x17b>
movss  0xdd1(%rip),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
cvttss2si -0x4(%rbp),%eax
add    $0x30,%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x14(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
cvttss2si -0x4(%rbp),%eax
cvtsi2ss %eax,%xmm1
movss  -0x4(%rbp),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x14(%rbp)
movslq %ecx,%rcx
movb   $0x2e,(%rax,%rcx,1)
jmp    12f7 <ftoa+0x1c7>
cvttss2si -0x4(%rbp),%eax
add    $0x30,%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x14(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
cvttss2si -0x4(%rbp),%eax
cvtsi2ss %eax,%xmm1
movss  -0x4(%rbp),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x14(%rbp)
movslq %ecx,%rcx
movb   $0x2e,(%rax,%rcx,1)
movl   $0x0,-0x18(%rbp)
cmpl   $0x4,-0x18(%rbp)
jge    135e <ftoa+0x22e>
movss  0xd08(%rip),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
cvttss2si -0x4(%rbp),%eax
add    $0x30,%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x14(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
cvttss2si -0x4(%rbp),%eax
cvtsi2ss %eax,%xmm1
movss  -0x4(%rbp),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12fe <ftoa+0x1ce>
cmpl   $0x0,-0x1c(%rbp)
je     13d8 <ftoa+0x2a8>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x14(%rbp)
movslq %ecx,%rcx
movb   $0x78,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x14(%rbp)
movslq %ecx,%rcx
movb   $0x31,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x14(%rbp)
movslq %ecx,%rcx
movb   $0x30,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x14(%rbp)
movslq %ecx,%rcx
movb   $0x65,(%rax,%rcx,1)
mov    -0x1c(%rbp),%edi
mov    -0x10(%rbp),%rsi
movslq -0x14(%rbp),%rax
add    %rax,%rsi
call   1030 <ltoa@plt>
jmp    13e4 <ftoa+0x2b4>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ftoa>:
push   %rbp
push   %r15
push   %r14
push   %rbx
sub    $0x18,%rsp
mov    %rdi,%rbx
xor    %r15d,%r15d
xorps  %xmm1,%xmm1
ucomiss %xmm0,%xmm1
jbe    115a <ftoa+0x2a>
movb   $0x2d,(%rbx)
xorps  0xeae(%rip),%xmm0
mov    $0x1,%r14d
jmp    115d <ftoa+0x2d>
xor    %r14d,%r14d
movaps %xmm0,(%rsp)
ucomiss %xmm1,%xmm0
jne    1168 <ftoa+0x38>
jnp    1174 <ftoa+0x44>
movaps (%rsp),%xmm0
call   1050 <log10@plt>
mov    %eax,%r15d
xorps  %xmm1,%xmm1
cvtsi2sd %r15d,%xmm1
movsd  0xe8c(%rip),%xmm0
call   1040 <pow@plt>
movaps (%rsp),%xmm2
divss  %xmm0,%xmm2
ucomiss 0xe80(%rip),%xmm2
seta   %sil
movss  0xe78(%rip),%xmm0
ucomiss %xmm2,%xmm0
seta   %dl
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm2
setp   %cl
setne  %al
or     %cl,%al
and    %dl,%al
movss  0xe5e(%rip),%xmm0
and    %sil,%al
je     11cb <ftoa+0x9b>
mulss  %xmm0,%xmm2
movzbl %al,%r8d
cvttss2si %xmm2,%edx
add    $0x30,%dl
mov    %r14d,%eax
cvttps2dq %xmm2,%xmm1
cvtdq2ps %xmm1,%xmm1
subss  %xmm1,%xmm2
mulss  %xmm0,%xmm2
cvttss2si %xmm2,%esi
cvttps2dq %xmm2,%xmm1
cvtdq2ps %xmm1,%xmm1
subss  %xmm1,%xmm2
mulss  %xmm0,%xmm2
cvttss2si %xmm2,%ecx
add    $0x30,%sil
add    $0x30,%cl
cvttps2dq %xmm2,%xmm1
cvtdq2ps %xmm1,%xmm1
subss  %xmm1,%xmm2
mulss  %xmm0,%xmm2
cvttss2si %xmm2,%ebp
add    $0x30,%bpl
cvttps2dq %xmm2,%xmm1
cvtdq2ps %xmm1,%xmm1
subss  %xmm1,%xmm2
mulss  %xmm0,%xmm2
cvttss2si %xmm2,%edi
add    $0x30,%dil
lea    0x6(%rax),%r9
mov    %dl,(%rbx,%rax,1)
movb   $0x2e,0x1(%rbx,%rax,1)
mov    %sil,0x2(%rbx,%rax,1)
mov    %cl,0x3(%rbx,%rax,1)
mov    %bpl,0x4(%rbx,%rax,1)
mov    %dil,0x5(%rbx,%rax,1)
sub    %r8d,%r15d
je     1287 <ftoa+0x157>
or     $0x2,%rax
movb   $0x78,(%rbx,%r9,1)
movw   $0x3031,0x5(%rbx,%rax,1)
movb   $0x65,0x7(%rbx,%rax,1)
lea    (%rbx,%rax,1),%rsi
add    $0x8,%rsi
mov    %r15d,%edi
add    $0x18,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <ltoa@plt>
movb   $0x0,(%rbx,%r9,1)
add    $0x18,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @ftoa(float %0, i8* %1) {
%3 = fcmp olt float %0, 0.000000e+00
br i1 %3, label %4, label %6
4: ; preds = %2
store i8 45, i8* %1
%5 = fneg float %0
br label %6
6: ; preds = %4, %2
%7 = phi i32 [ 1, %4 ], [ 0, %2 ]
%8 = phi float [ %5, %4 ], [ %0, %2 ]
%9 = fcmp une float %8, 0.000000e+00
br i1 %9, label %10, label %12
10: ; preds = %6
%11 = tail call i32 @log10(float %8)
br label %12
12: ; preds = %6, %10
%13 = phi i32 [ %11, %10 ], [ 0, %6 ]
%14 = sitofp i32 %13 to double
%15 = tail call float @pow(double 1.000000e+01, double %14)
%16 = fdiv float %8, %15
%17 = fcmp ogt float %16, -1.000000e+00
%18 = fcmp olt float %16, 1.000000e+00
%19 = and i1 %17, %18
%20 = fcmp une float %16, 0.000000e+00
%21 = and i1 %20, %19
%22 = fmul float %16, 1.000000e+01
%23 = select i1 %21, float %22, float %16
%24 = sext i1 %21 to i32
%25 = add nsw i32 %13, %24
%26 = fptosi float %23 to i32
%27 = trunc i32 %26 to i8
%28 = add i8 %27, 48
%29 = add nuw nsw i32 %7, 1
%30 = zext i32 %7 to i64
%31 = getelementptr inbounds i8, i8* %1, i64 %30
store i8 %28, i8* %31
%32 = sitofp i32 %26 to float
%33 = fsub float %23, %32
%34 = zext i32 %29 to i64
%35 = getelementptr inbounds i8, i8* %1, i64 %34
store i8 46, i8* %35
%36 = or i32 %7, 2
%37 = zext i32 %36 to i64
%38 = fmul float %33, 1.000000e+01
%39 = fptosi float %38 to i32
%40 = trunc i32 %39 to i8
%41 = add i8 %40, 48
%42 = add nuw nsw i64 %37, 1
%43 = getelementptr inbounds i8, i8* %1, i64 %37
store i8 %41, i8* %43
%44 = sitofp i32 %39 to float
%45 = fsub float %38, %44
%46 = fmul float %45, 1.000000e+01
%47 = fptosi float %46 to i32
%48 = trunc i32 %47 to i8
%49 = add i8 %48, 48
%50 = add nuw nsw i64 %37, 2
%51 = getelementptr inbounds i8, i8* %1, i64 %42
store i8 %49, i8* %51
%52 = sitofp i32 %47 to float
%53 = fsub float %46, %52
%54 = fmul float %53, 1.000000e+01
%55 = fptosi float %54 to i32
%56 = trunc i32 %55 to i8
%57 = add i8 %56, 48
%58 = add nuw nsw i64 %37, 3
%59 = getelementptr inbounds i8, i8* %1, i64 %50
store i8 %57, i8* %59
%60 = sitofp i32 %55 to float
%61 = fsub float %54, %60
%62 = fmul float %61, 1.000000e+01
%63 = fptosi float %62 to i32
%64 = trunc i32 %63 to i8
%65 = add i8 %64, 48
%66 = or i32 %7, 6
%67 = getelementptr inbounds i8, i8* %1, i64 %58
store i8 %65, i8* %67
%68 = icmp eq i32 %25, 0
br i1 %68, label %81, label %69
69: ; preds = %12
%70 = add nuw nsw i64 %37, 5
%71 = zext i32 %66 to i64
%72 = getelementptr inbounds i8, i8* %1, i64 %71
store i8 120, i8* %72
%73 = add nuw nsw i64 %37, 6
%74 = getelementptr inbounds i8, i8* %1, i64 %70
store i8 49, i8* %74
%75 = add nuw nsw i64 %37, 7
%76 = getelementptr inbounds i8, i8* %1, i64 %73
store i8 48, i8* %76
%77 = or i64 %37, 8
%78 = getelementptr inbounds i8, i8* %1, i64 %75
store i8 101, i8* %78
%79 = getelementptr inbounds i8, i8* %1, i64 %77
%80 = tail call i32 @ltoa(i32 %25, i8* %79)
br label %84
81: ; preds = %12
%82 = zext i32 %66 to i64
%83 = getelementptr inbounds i8, i8* %1, i64 %82
store i8 0, i8* %83
br label %84
84: ; preds = %81, %69
ret void
}