float Q_atof(const char *str) {
  double val = 0;
  int c, sign, decimal, total;
  if (!str)
    return 0.0f;
  while (str && *str == ' ')
    str++;
  if (!str)
    return 0.0f;
  if (*str == '-') {
    sign = -1;
    str++;
  } else
    sign = 1;
  if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
    str += 2;
    while (1) {
      c = *str++;
      if (c >= '0' && c <= '9')
        val = (val * 16) + c - '0';
      else if (c >= 'a' && c <= 'f')
        val = (val * 16) + c - 'a' + 10;
      else if (c >= 'A' && c <= 'F')
        val = (val * 16) + c - 'A' + 10;
      else
        return val * sign;
    }
  }
  if (str[0] == '\'')
    return sign * str[1];
  decimal = -1;
  total = 0;
  while (1) {
    c = *str++;
    if (c == '.') {
      decimal = total;
      continue;
    }
    if (c < '0' || c > '9')
      break;
    val = val * 10 + c - '0';
    total++;
  }
  if (decimal == -1)
    return val * sign;
  while (total > decimal) {
    val /= 10;
    total--;
  }
  return val * sign;
}


x86 assembly (clang, -O0):
<Q_atof>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1128 <Q_atof+0x28>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    143f <Q_atof+0x33f>
jmp    112d <Q_atof+0x2d>
xor    %eax,%eax
cmpq   $0x0,-0x10(%rbp)
mov    %al,-0x29(%rbp)
je     114d <Q_atof+0x4d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
sete   %al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
test   $0x1,%al
jne    115d <Q_atof+0x5d>
jmp    116e <Q_atof+0x6e>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    112d <Q_atof+0x2d>
cmpq   $0x0,-0x10(%rbp)
jne    1186 <Q_atof+0x86>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    143f <Q_atof+0x33f>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    11ae <Q_atof+0xae>
movl   $0xffffffff,-0x20(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    11b5 <Q_atof+0xb5>
movl   $0x1,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    1317 <Q_atof+0x217>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x78,%eax
je     11e7 <Q_atof+0xe7>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x58,%eax
jne    1317 <Q_atof+0x217>
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x30,-0x1c(%rbp)
jl     124c <Q_atof+0x14c>
cmpl   $0x39,-0x1c(%rbp)
jg     124c <Q_atof+0x14c>
movsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0x1c(%rbp),%xmm1
movsd  0xdea(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xdc2(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    1312 <Q_atof+0x212>
cmpl   $0x61,-0x1c(%rbp)
jl     129c <Q_atof+0x19c>
cmpl   $0x66,-0x1c(%rbp)
jg     129c <Q_atof+0x19c>
movsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0x1c(%rbp),%xmm1
movsd  0xda6(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xd9e(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xd7a(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    130d <Q_atof+0x20d>
cmpl   $0x41,-0x1c(%rbp)
jl     12ec <Q_atof+0x1ec>
cmpl   $0x46,-0x1c(%rbp)
jg     12ec <Q_atof+0x1ec>
movsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0x1c(%rbp),%xmm1
movsd  0xd56(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xd3e(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xd2a(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    1308 <Q_atof+0x208>
movsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0x20(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    143f <Q_atof+0x33f>
jmp    130d <Q_atof+0x20d>
jmp    1312 <Q_atof+0x212>
jmp    11f3 <Q_atof+0xf3>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x27,%eax
jne    1343 <Q_atof+0x243>
mov    -0x20(%rbp),%eax
mov    -0x10(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
imul   %ecx,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    143f <Q_atof+0x33f>
movl   $0xffffffff,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x2e,-0x1c(%rbp)
jne    137b <Q_atof+0x27b>
mov    -0x28(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1351 <Q_atof+0x251>
cmpl   $0x30,-0x1c(%rbp)
jl     138f <Q_atof+0x28f>
cmpl   $0x39,-0x1c(%rbp)
jle    1394 <Q_atof+0x294>
jmp    13cd <Q_atof+0x2cd>
movsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0x1c(%rbp),%xmm1
movsd  0xc62(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xc4a(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1351 <Q_atof+0x251>
cmpl   $0xffffffff,-0x24(%rbp)
jne    13f3 <Q_atof+0x2f3>
movsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0x20(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    143f <Q_atof+0x33f>
jmp    13f8 <Q_atof+0x2f8>
mov    -0x28(%rbp),%eax
cmp    -0x24(%rbp),%eax
jle    1428 <Q_atof+0x328>
movsd  -0x18(%rbp),%xmm0
movsd  0xbf7(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    13f8 <Q_atof+0x2f8>
movsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0x20(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<Q_atof>:
test   %rdi,%rdi
je     1207 <Q_atof+0x107>
add    $0x1,%rdi
nopl   (%rax)
movzbl -0x1(%rdi),%eax
add    $0x1,%rdi
cmp    $0x20,%al
je     1110 <Q_atof+0x10>
xor    %edx,%edx
xor    %ecx,%ecx
cmp    $0x2d,%al
setne  %dl
sete   %cl
lea    (%rdx,%rdx,1),%r8d
add    $0xffffffff,%r8d
mov    -0x2(%rdi,%rcx,1),%sil
cmp    $0x27,%sil
je     12fc <Q_atof+0x1fc>
cmp    $0x30,%sil
jne    120b <Q_atof+0x10b>
mov    -0x1(%rdi,%rcx,1),%al
or     $0x20,%al
cmp    $0x78,%al
jne    120b <Q_atof+0x10b>
add    %rcx,%rdi
xorpd  %xmm0,%xmm0
movsd  0xe9a(%rip),%xmm1
movsd  0xeb2(%rip),%xmm2
movsd  0xea2(%rip),%xmm3
movsd  0xe92(%rip),%xmm4
movsd  0xe82(%rip),%xmm5
jmp    11a6 <Q_atof+0xa6>
nopl   0x0(%rax,%rax,1)
movsbl %cl,%eax
xorps  %xmm6,%xmm6
cvtsi2sd %eax,%xmm6
mulsd  %xmm1,%xmm0
addsd  %xmm6,%xmm0
addsd  %xmm2,%xmm0
movzbl (%rdi),%ecx
add    $0x1,%rdi
lea    -0x30(%rcx),%eax
cmp    $0x9,%al
jbe    1190 <Q_atof+0x90>
lea    -0x61(%rcx),%eax
cmp    $0x5,%al
ja     11e0 <Q_atof+0xe0>
movsbl %cl,%eax
xorps  %xmm6,%xmm6
cvtsi2sd %eax,%xmm6
mulsd  %xmm1,%xmm0
addsd  %xmm6,%xmm0
addsd  %xmm3,%xmm0
addsd  %xmm4,%xmm0
jmp    11a6 <Q_atof+0xa6>
nopw   0x0(%rax,%rax,1)
lea    -0x41(%rcx),%eax
cmp    $0x5,%al
ja     12eb <Q_atof+0x1eb>
movsbl %cl,%eax
xorps  %xmm6,%xmm6
cvtsi2sd %eax,%xmm6
mulsd  %xmm1,%xmm0
addsd  %xmm6,%xmm0
addsd  %xmm5,%xmm0
addsd  %xmm4,%xmm0
jmp    11a6 <Q_atof+0xa6>
xorps  %xmm0,%xmm0
ret
add    %rcx,%rdi
add    $0xfffffffffffffffe,%rdi
xor    %ecx,%ecx
mov    $0xffffffff,%edx
xorpd  %xmm0,%xmm0
movsd  0xdeb(%rip),%xmm1
movsd  0xdf3(%rip),%xmm2
nopl   (%rax)
add    $0x1,%rdi
cmp    $0x2e,%sil
jne    124f <Q_atof+0x14f>
nopw   0x0(%rax,%rax,1)
movzbl (%rdi),%esi
add    $0x1,%rdi
cmp    $0x2e,%sil
je     1240 <Q_atof+0x140>
mov    %ecx,%edx
lea    -0x3a(%rsi),%eax
cmp    $0xf6,%al
jb     1275 <Q_atof+0x175>
movsbl %sil,%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
mulsd  %xmm1,%xmm0
addsd  %xmm3,%xmm0
addsd  %xmm2,%xmm0
add    $0x1,%ecx
mov    (%rdi),%sil
jmp    1230 <Q_atof+0x130>
cmp    $0xffffffff,%edx
je     12eb <Q_atof+0x1eb>
mov    %ecx,%eax
sub    %edx,%eax
jle    12d7 <Q_atof+0x1d7>
mov    %edx,%esi
not    %esi
add    %ecx,%esi
test   $0x3,%al
je     12ad <Q_atof+0x1ad>
mov    %ecx,%eax
sub    %dl,%al
movzbl %al,%edi
and    $0x3,%edi
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
divsd  %xmm1,%xmm0
add    $0x1,%eax
cmp    %eax,%edi
jne    12a0 <Q_atof+0x1a0>
sub    %eax,%ecx
cmp    $0x3,%esi
jb     12d7 <Q_atof+0x1d7>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
divsd  %xmm1,%xmm0
divsd  %xmm1,%xmm0
divsd  %xmm1,%xmm0
divsd  %xmm1,%xmm0
add    $0xfffffffc,%ecx
cmp    %edx,%ecx
jg     12c0 <Q_atof+0x1c0>
xorps  %xmm1,%xmm1
cvtsi2sd %r8d,%xmm1
mulsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
ret
xorps  %xmm1,%xmm1
cvtsi2sd %r8d,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
ret
movsbl -0x1(%rdi,%rcx,1),%eax
imul   %eax,%r8d
cvtsi2ss %r8d,%xmm0
ret

LLVM IR (-O0):
define float @Q_atof(i8* %0) {
%2 = alloca float
%3 = alloca i8*
%4 = alloca double
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i8* %0, i8** %3
store double 0.000000e+00, double* %4
%9 = load i8*, i8** %3
%10 = icmp ne i8* %9, null
br i1 %10, label %12, label %11
11: ; preds = %1
store float 0.000000e+00, float* %2
br label %175
12: ; preds = %1
br label %13
13: ; preds = %23, %12
%14 = load i8*, i8** %3
%15 = icmp ne i8* %14, null
br i1 %15, label %16, label %21
16: ; preds = %13
%17 = load i8*, i8** %3
%18 = load i8, i8* %17
%19 = sext i8 %18 to i32
%20 = icmp eq i32 %19, 32
br label %21
21: ; preds = %16, %13
%22 = phi i1 [ false, %13 ], [ %20, %16 ]
br i1 %22, label %23, label %26
23: ; preds = %21
%24 = load i8*, i8** %3
%25 = getelementptr inbounds i8, i8* %24, i32 1
store i8* %25, i8** %3
br label %13
26: ; preds = %21
%27 = load i8*, i8** %3
%28 = icmp ne i8* %27, null
br i1 %28, label %30, label %29
29: ; preds = %26
store float 0.000000e+00, float* %2
br label %175
30: ; preds = %26
%31 = load i8*, i8** %3
%32 = load i8, i8* %31
%33 = sext i8 %32 to i32
%34 = icmp eq i32 %33, 45
br i1 %34, label %35, label %38
35: ; preds = %30
store i32 -1, i32* %6
%36 = load i8*, i8** %3
%37 = getelementptr inbounds i8, i8* %36, i32 1
store i8* %37, i8** %3
br label %39
38: ; preds = %30
store i32 1, i32* %6
br label %39
39: ; preds = %38, %35
%40 = load i8*, i8** %3
%41 = getelementptr inbounds i8, i8* %40, i64 0
%42 = load i8, i8* %41
%43 = sext i8 %42 to i32
%44 = icmp eq i32 %43, 48
br i1 %44, label %45, label %111
45: ; preds = %39
%46 = load i8*, i8** %3
%47 = getelementptr inbounds i8, i8* %46, i64 1
%48 = load i8, i8* %47
%49 = sext i8 %48 to i32
%50 = icmp eq i32 %49, 120
br i1 %50, label %57, label %51
51: ; preds = %45
%52 = load i8*, i8** %3
%53 = getelementptr inbounds i8, i8* %52, i64 1
%54 = load i8, i8* %53
%55 = sext i8 %54 to i32
%56 = icmp eq i32 %55, 88
br i1 %56, label %57, label %111
57: ; preds = %51, %45
%58 = load i8*, i8** %3
%59 = getelementptr inbounds i8, i8* %58, i64 2
store i8* %59, i8** %3
br label %60
60: ; preds = %57, %110
%61 = load i8*, i8** %3
%62 = getelementptr inbounds i8, i8* %61, i32 1
store i8* %62, i8** %3
%63 = load i8, i8* %61
%64 = sext i8 %63 to i32
store i32 %64, i32* %5
%65 = load i32, i32* %5
%66 = icmp sge i32 %65, 48
br i1 %66, label %67, label %76
67: ; preds = %60
%68 = load i32, i32* %5
%69 = icmp sle i32 %68, 57
br i1 %69, label %70, label %76
70: ; preds = %67
%71 = load double, double* %4
%72 = load i32, i32* %5
%73 = sitofp i32 %72 to double
%74 = call double @llvm.fmuladd.f64(double %71, double 1.600000e+01, double %73)
%75 = fsub double %74, 4.800000e+01
store double %75, double* %4
br label %110
76: ; preds = %67, %60
%77 = load i32, i32* %5
%78 = icmp sge i32 %77, 97
br i1 %78, label %79, label %89
79: ; preds = %76
%80 = load i32, i32* %5
%81 = icmp sle i32 %80, 102
br i1 %81, label %82, label %89
82: ; preds = %79
%83 = load double, double* %4
%84 = load i32, i32* %5
%85 = sitofp i32 %84 to double
%86 = call double @llvm.fmuladd.f64(double %83, double 1.600000e+01, double %85)
%87 = fsub double %86, 9.700000e+01
%88 = fadd double %87, 1.000000e+01
store double %88, double* %4
br label %109
89: ; preds = %79, %76
%90 = load i32, i32* %5
%91 = icmp sge i32 %90, 65
br i1 %91, label %92, label %102
92: ; preds = %89
%93 = load i32, i32* %5
%94 = icmp sle i32 %93, 70
br i1 %94, label %95, label %102
95: ; preds = %92
%96 = load double, double* %4
%97 = load i32, i32* %5
%98 = sitofp i32 %97 to double
%99 = call double @llvm.fmuladd.f64(double %96, double 1.600000e+01, double %98)
%100 = fsub double %99, 6.500000e+01
%101 = fadd double %100, 1.000000e+01
store double %101, double* %4
br label %108
102: ; preds = %92, %89
%103 = load double, double* %4
%104 = load i32, i32* %6
%105 = sitofp i32 %104 to double
%106 = fmul double %103, %105
%107 = fptrunc double %106 to float
store float %107, float* %2
br label %175
108: ; preds = %95
br label %109
109: ; preds = %108, %82
br label %110
110: ; preds = %109, %70
br label %60
111: ; preds = %51, %39
%112 = load i8*, i8** %3
%113 = getelementptr inbounds i8, i8* %112, i64 0
%114 = load i8, i8* %113
%115 = sext i8 %114 to i32
%116 = icmp eq i32 %115, 39
br i1 %116, label %117, label %125
117: ; preds = %111
%118 = load i32, i32* %6
%119 = load i8*, i8** %3
%120 = getelementptr inbounds i8, i8* %119, i64 1
%121 = load i8, i8* %120
%122 = sext i8 %121 to i32
%123 = mul nsw i32 %118, %122
%124 = sitofp i32 %123 to float
store float %124, float* %2
br label %175
125: ; preds = %111
store i32 -1, i32* %7
store i32 0, i32* %8
br label %126
126: ; preds = %125, %133, %142
%127 = load i8*, i8** %3
%128 = getelementptr inbounds i8, i8* %127, i32 1
store i8* %128, i8** %3
%129 = load i8, i8* %127
%130 = sext i8 %129 to i32
store i32 %130, i32* %5
%131 = load i32, i32* %5
%132 = icmp eq i32 %131, 46
br i1 %132, label %133, label %135
133: ; preds = %126
%134 = load i32, i32* %8
store i32 %134, i32* %7
br label %126
135: ; preds = %126
%136 = load i32, i32* %5
%137 = icmp slt i32 %136, 48
br i1 %137, label %141, label %138
138: ; preds = %135
%139 = load i32, i32* %5
%140 = icmp sgt i32 %139, 57
br i1 %140, label %141, label %142
141: ; preds = %138, %135
br label %150
142: ; preds = %138
%143 = load double, double* %4
%144 = load i32, i32* %5
%145 = sitofp i32 %144 to double
%146 = call double @llvm.fmuladd.f64(double %143, double 1.000000e+01, double %145)
%147 = fsub double %146, 4.800000e+01
store double %147, double* %4
%148 = load i32, i32* %8
%149 = add nsw i32 %148, 1
store i32 %149, i32* %8
br label %126
150: ; preds = %141
%151 = load i32, i32* %7
%152 = icmp eq i32 %151, -1
br i1 %152, label %153, label %159
153: ; preds = %150
%154 = load double, double* %4
%155 = load i32, i32* %6
%156 = sitofp i32 %155 to double
%157 = fmul double %154, %156
%158 = fptrunc double %157 to float
store float %158, float* %2
br label %175
159: ; preds = %150
br label %160
160: ; preds = %164, %159
%161 = load i32, i32* %8
%162 = load i32, i32* %7
%163 = icmp sgt i32 %161, %162
br i1 %163, label %164, label %169
164: ; preds = %160
%165 = load double, double* %4
%166 = fdiv double %165, 1.000000e+01
store double %166, double* %4
%167 = load i32, i32* %8
%168 = add nsw i32 %167, -1
store i32 %168, i32* %8
br label %160
169: ; preds = %160
%170 = load double, double* %4
%171 = load i32, i32* %6
%172 = sitofp i32 %171 to double
%173 = fmul double %170, %172
%174 = fptrunc double %173 to float
store float %174, float* %2
br label %175
175: ; preds = %169, %153, %117, %102, %29, %11
%176 = load float, float* %2
ret float %176
}

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