double atof(p)
register char *p;
{
  static double twoe37 = 137438953472.;
  static double exp10[] = {
      10., 100., 10000., 100000000., 10000000000000000.,
  };
  register c, exp = 0, eexp = 0;
  double fl = 0, flexp = 1.0;
  int bexp, neg = 1, negexp = 1;
  while ((c = *p++) == ' ')
    ;
  if (c == '-')
    neg = -1;
  else if (c == '+')
    ;
  else
    --p;
  while ((c = *p++), c >= '0' && c <= '9')
    if (fl < twoe37)
      fl = 10 * fl + (c - '0');
    else
      exp++;
  if (c == '.')
    while ((c = *p++), c >= '0' && c <= '9')
      if (fl < twoe37) {
        fl = 10 * fl + (c - '0');
        exp--;
      }
  if ((c == 'E') || (c == 'e')) {
    if ((c = *p++) == '+')
      ;
    else if (c == '-')
      negexp = -1;
    else
      --p;
    while ((c = *p++), c >= '0' && c <= '9')
      eexp = 10 * eexp + (c - '0');
    if (negexp < 0)
      eexp = -eexp;
    exp += eexp;
  }
  bexp = exp;
  if (exp < 0)
    exp = -exp;
  for (c = 0; c < 5; c++) {
    if (exp & 01)
      flexp *= exp10[c];
    exp >>= 1;
    if (exp == 0)
      break;
  }
  if (bexp < 0)
    fl /= flexp;
  else
    fl *= flexp;
  if (neg < 0)
    return (-fl);
  else
    return (fl);
}


x86 assembly (clang, -O0):
<atof>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xeda(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x1,-0x38(%rbp)
movl   $0x1,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x14(%rbp)
cmp    $0x20,%eax
jne    115c <atof+0x5c>
jmp    1139 <atof+0x39>
cmpl   $0x2d,-0x14(%rbp)
jne    1172 <atof+0x72>
movl   $0xffffffff,-0x38(%rbp)
jmp    1192 <atof+0x92>
cmpl   $0x2b,-0x14(%rbp)
jne    1181 <atof+0x81>
jmp    118d <atof+0x8d>
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x10(%rbp)
jmp    1192 <atof+0x92>
jmp    1197 <atof+0x97>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x14(%rbp)
xor    %eax,%eax
cmpl   $0x30,-0x14(%rbp)
mov    %al,-0x3d(%rbp)
jl     11c5 <atof+0xc5>
cmpl   $0x39,-0x14(%rbp)
setle  %al
mov    %al,-0x3d(%rbp)
mov    -0x3d(%rbp),%al
test   $0x1,%al
jne    11d5 <atof+0xd5>
jmp    1223 <atof+0x123>
movsd  -0x28(%rbp),%xmm1
movsd  0x2e4e(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1215 <atof+0x115>
movsd  -0x28(%rbp),%xmm0
mov    -0x14(%rbp),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xe05(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    121e <atof+0x11e>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1197 <atof+0x97>
cmpl   $0x2e,-0x14(%rbp)
jne    12be <atof+0x1be>
jmp    1232 <atof+0x132>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x14(%rbp)
xor    %eax,%eax
cmpl   $0x30,-0x14(%rbp)
mov    %al,-0x3e(%rbp)
jl     1260 <atof+0x160>
cmpl   $0x39,-0x14(%rbp)
setle  %al
mov    %al,-0x3e(%rbp)
mov    -0x3e(%rbp),%al
test   $0x1,%al
jne    1270 <atof+0x170>
jmp    12b9 <atof+0x1b9>
movsd  -0x28(%rbp),%xmm1
movsd  0x2db3(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    12b4 <atof+0x1b4>
movsd  -0x28(%rbp),%xmm0
mov    -0x14(%rbp),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xd6a(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    1232 <atof+0x132>
jmp    12be <atof+0x1be>
cmpl   $0x45,-0x14(%rbp)
je     12d2 <atof+0x1d2>
cmpl   $0x65,-0x14(%rbp)
jne    138e <atof+0x28e>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x14(%rbp)
cmp    $0x2b,%eax
jne    12f5 <atof+0x1f5>
jmp    131c <atof+0x21c>
cmpl   $0x2d,-0x14(%rbp)
jne    130b <atof+0x20b>
movl   $0xffffffff,-0x3c(%rbp)
jmp    1317 <atof+0x217>
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x10(%rbp)
jmp    131c <atof+0x21c>
jmp    1321 <atof+0x221>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x14(%rbp)
xor    %eax,%eax
cmpl   $0x30,-0x14(%rbp)
mov    %al,-0x3f(%rbp)
jl     134f <atof+0x24f>
cmpl   $0x39,-0x14(%rbp)
setle  %al
mov    %al,-0x3f(%rbp)
mov    -0x3f(%rbp),%al
test   $0x1,%al
jne    135f <atof+0x25f>
jmp    1373 <atof+0x273>
imul   $0xa,-0x1c(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x1c(%rbp)
jmp    1321 <atof+0x221>
cmpl   $0x0,-0x3c(%rbp)
jge    1385 <atof+0x285>
xor    %eax,%eax
sub    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x18(%rbp)
jge    13a6 <atof+0x2a6>
xor    %eax,%eax
sub    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x5,-0x14(%rbp)
jge    140b <atof+0x30b>
mov    -0x18(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     13e0 <atof+0x2e0>
movslq -0x14(%rbp),%rcx
lea    0x2c6f(%rip),%rax
movsd  (%rax,%rcx,8),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x18(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
jne    13f8 <atof+0x2f8>
jmp    140b <atof+0x30b>
jmp    13fd <atof+0x2fd>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    13ad <atof+0x2ad>
cmpl   $0x0,-0x34(%rbp)
jge    142d <atof+0x32d>
movsd  -0x30(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    143c <atof+0x33c>
movsd  -0x30(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
cmpl   $0x0,-0x38(%rbp)
jge    146c <atof+0x36c>
movsd  -0x28(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1476 <atof+0x376>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<atof>:
movzbl (%rdi),%eax
add    $0x1,%rdi
cmp    $0x20,%al
je     1100 <atof>
cmp    $0x2b,%al
je     111c <atof+0x1c>
cmp    $0x2d,%al
jne    1118 <atof+0x18>
mov    $0x1,%r8b
jmp    111f <atof+0x1f>
add    $0xffffffffffffffff,%rdi
xor    %r8d,%r8d
mov    (%rdi),%dl
add    $0x1,%rdi
lea    -0x30(%rdx),%eax
cmp    $0x9,%al
ja     117e <atof+0x7e>
xor    %ecx,%ecx
xorpd  %xmm0,%xmm0
movsd  0xec6(%rip),%xmm1
movsd  0xec6(%rip),%xmm2
jmp    1161 <atof+0x61>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%ecx
movzbl (%rdi),%edx
add    $0x1,%rdi
lea    -0x30(%rdx),%eax
cmp    $0xa,%al
jae    1184 <atof+0x84>
ucomisd %xmm0,%xmm1
jbe    1150 <atof+0x50>
movzbl %dl,%eax
add    $0xffffffd0,%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
mulsd  %xmm2,%xmm0
addsd  %xmm3,%xmm0
jmp    1153 <atof+0x53>
xorpd  %xmm0,%xmm0
xor    %ecx,%ecx
cmp    $0x2e,%dl
jne    11de <atof+0xde>
mov    (%rdi),%dl
add    $0x1,%rdi
lea    -0x30(%rdx),%eax
cmp    $0x9,%al
ja     11de <atof+0xde>
movsd  0xe62(%rip),%xmm1
movsd  0xe62(%rip),%xmm2
jmp    11be <atof+0xbe>
nopl   0x0(%rax,%rax,1)
movzbl (%rdi),%edx
add    $0x1,%rdi
lea    -0x30(%rdx),%eax
cmp    $0xa,%al
jae    11de <atof+0xde>
ucomisd %xmm0,%xmm1
jbe    11b0 <atof+0xb0>
movzbl %dl,%eax
add    $0xffffffd0,%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
mulsd  %xmm2,%xmm0
addsd  %xmm3,%xmm0
add    $0xffffffff,%ecx
jmp    11b0 <atof+0xb0>
and    $0xdf,%dl
cmp    $0x45,%dl
jne    1247 <atof+0x147>
lea    0x1(%rdi),%rsi
mov    (%rdi),%al
xor    %edx,%edx
cmp    $0x2b,%al
je     11fb <atof+0xfb>
cmp    $0x2d,%al
jne    1200 <atof+0x100>
mov    $0x1,%r9b
jmp    1206 <atof+0x106>
xor    %r9d,%r9d
jmp    1206 <atof+0x106>
xor    %r9d,%r9d
mov    %rdi,%rsi
mov    (%rsi),%dil
lea    -0x30(%rdi),%eax
cmp    $0x9,%al
ja     123b <atof+0x13b>
add    $0x1,%rsi
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
movzbl %dil,%eax
lea    (%rdx,%rdx,4),%edx
lea    (%rax,%rdx,2),%edx
add    $0xffffffd0,%edx
movzbl (%rsi),%edi
lea    -0x30(%rdi),%eax
add    $0x1,%rsi
cmp    $0xa,%al
jb     1220 <atof+0x120>
mov    %edx,%eax
neg    %eax
test   %r9b,%r9b
cmove  %edx,%eax
add    %eax,%ecx
mov    %ecx,%edx
neg    %edx
cmovs  %ecx,%edx
xor    %eax,%eax
test   $0x1,%dl
sete   %al
lea    0xdd3(%rip),%rsi
movsd  (%rsi,%rax,8),%xmm1
cmp    $0x2,%edx
jb     12aa <atof+0x1aa>
test   $0x2,%dl
je     1274 <atof+0x174>
mulsd  0xd9c(%rip),%xmm1
cmp    $0x4,%edx
jb     12aa <atof+0x1aa>
test   $0x4,%dl
je     1286 <atof+0x186>
mulsd  0xd92(%rip),%xmm1
cmp    $0x8,%edx
jb     12aa <atof+0x1aa>
test   $0x8,%dl
je     1298 <atof+0x198>
mulsd  0xd88(%rip),%xmm1
cmp    $0x10,%edx
jb     12aa <atof+0x1aa>
test   $0x10,%dl
je     12aa <atof+0x1aa>
mulsd  0xd7e(%rip),%xmm1
test   %ecx,%ecx
js     12c0 <atof+0x1c0>
mulsd  %xmm1,%xmm0
test   %r8b,%r8b
je     12bf <atof+0x1bf>
xorpd  0xd81(%rip),%xmm0
ret
divsd  %xmm1,%xmm0
test   %r8b,%r8b
jne    12b7 <atof+0x1b7>
jmp    12bf <atof+0x1bf>

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

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