const char *streamtod(const char *first, const char *last, double *out) {
  int negative = 0;
  double result = 0;
  double inv_base = 0.1f;
  int exponent_negative = 0;
  int exponent = 0;
  double power_of_ten = 10;
  if (first != last) {
    if (*first == '-') {
      negative = 1;
      ++first;
    } else if (*first == '+') {
      ++first;
    }
  }
  for (; first != last && (*first >= '0' && *first <= '9'); ++first) {
    result = (10 * result) + (*first - '0');
  }
  if (first != last && *first == '.') {
    ++first;
    for (; first != last && (*first >= '0' && *first <= '9'); ++first) {
      result += (*first - '0') * inv_base;
      inv_base *= 0.1f;
    }
  }
  if (negative) {
    result *= -1;
  }
  if (first != last && (*first == 'e' || *first == 'E')) {
    ++first;
    if (*first == '-') {
      exponent_negative = 1;
      ++first;
    } else if (*first == '+') {
      ++first;
    }
    for (; first != last && (*first >= '0' && *first <= '9'); ++first) {
      exponent = 10 * exponent + (*first - '0');
    }
  }
  if (exponent) {
    for (; exponent > 1; exponent--) {
      power_of_ten *= 10;
    }
    if (exponent_negative) {
      result /= power_of_ten;
    } else {
      result *= power_of_ten;
    }
  }
  *out = result;
  return first;
}


x86 assembly (clang, -O0):
<streamtod>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xee1(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
movsd  0xebe(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x8(%rbp),%rax
cmp    -0x10(%rbp),%rax
je     11a3 <streamtod+0xa3>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    117d <streamtod+0x7d>
movl   $0x1,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    119e <streamtod+0x9e>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    1199 <streamtod+0x99>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    119e <streamtod+0x9e>
jmp    11a3 <streamtod+0xa3>
jmp    11a8 <streamtod+0xa8>
mov    -0x8(%rbp),%rcx
xor    %eax,%eax
cmp    -0x10(%rbp),%rcx
mov    %al,-0x41(%rbp)
je     11e6 <streamtod+0xe6>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x42(%rbp)
jl     11e0 <streamtod+0xe0>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x42(%rbp)
mov    -0x42(%rbp),%al
mov    %al,-0x41(%rbp)
mov    -0x41(%rbp),%al
test   $0x1,%al
jne    11f6 <streamtod+0xf6>
jmp    122f <streamtod+0x12f>
movsd  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xdef(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    11a8 <streamtod+0xa8>
mov    -0x8(%rbp),%rax
cmp    -0x10(%rbp),%rax
je     12f4 <streamtod+0x1f4>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    12f4 <streamtod+0x1f4>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rcx
xor    %eax,%eax
cmp    -0x10(%rbp),%rcx
mov    %al,-0x43(%rbp)
je     1297 <streamtod+0x197>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x44(%rbp)
jl     1291 <streamtod+0x191>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x44(%rbp)
mov    -0x44(%rbp),%al
mov    %al,-0x43(%rbp)
mov    -0x43(%rbp),%al
test   $0x1,%al
jne    12a7 <streamtod+0x1a7>
jmp    12ef <streamtod+0x1ef>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x28(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xd34(%rip),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1259 <streamtod+0x159>
jmp    12f4 <streamtod+0x1f4>
cmpl   $0x0,-0x1c(%rbp)
je     1310 <streamtod+0x210>
movsd  0xd0a(%rip),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
cmp    -0x10(%rbp),%rax
je     140f <streamtod+0x30f>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x65,%eax
je     133e <streamtod+0x23e>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x45,%eax
jne    140f <streamtod+0x30f>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1372 <streamtod+0x272>
movl   $0x1,-0x34(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1393 <streamtod+0x293>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    138e <streamtod+0x28e>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1393 <streamtod+0x293>
jmp    1398 <streamtod+0x298>
mov    -0x8(%rbp),%rcx
xor    %eax,%eax
cmp    -0x10(%rbp),%rcx
mov    %al,-0x45(%rbp)
je     13d6 <streamtod+0x2d6>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x46(%rbp)
jl     13d0 <streamtod+0x2d0>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x46(%rbp)
mov    -0x46(%rbp),%al
mov    %al,-0x45(%rbp)
mov    -0x45(%rbp),%al
test   $0x1,%al
jne    13e6 <streamtod+0x2e6>
jmp    140a <streamtod+0x30a>
imul   $0xa,-0x38(%rbp),%eax
mov    -0x8(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1398 <streamtod+0x298>
jmp    140f <streamtod+0x30f>
cmpl   $0x0,-0x38(%rbp)
je     147e <streamtod+0x37e>
jmp    141e <streamtod+0x31e>
cmpl   $0x1,-0x38(%rbp)
jle    1448 <streamtod+0x348>
movsd  0xbd0(%rip),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x38(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x38(%rbp)
jmp    141e <streamtod+0x31e>
cmpl   $0x0,-0x34(%rbp)
je     146a <streamtod+0x36a>
movsd  -0x40(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    1479 <streamtod+0x379>
movsd  -0x40(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    147e <streamtod+0x37e>
movsd  -0x28(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<streamtod>:
cmp    %rsi,%rdi
je     1170 <streamtod+0x70>
mov    %rdi,%rax
mov    (%rdi),%cl
mov    $0x1,%r8b
cmp    $0x2b,%cl
je     1179 <streamtod+0x79>
cmp    $0x2d,%cl
jne    111e <streamtod+0x1e>
add    $0x1,%rax
xor    %r8d,%r8d
cmp    %rsi,%rax
je     1182 <streamtod+0x82>
mov    %rsi,%r9
sub    %rax,%r9
xorpd  %xmm0,%xmm0
movsd  0xed3(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nop
movzbl (%rax),%ecx
lea    -0x30(%rcx),%edi
cmp    $0x9,%dil
ja     118b <streamtod+0x8b>
add    $0xffffffd0,%ecx
xorps  %xmm2,%xmm2
cvtsi2sd %ecx,%xmm2
mulsd  %xmm1,%xmm0
addsd  %xmm2,%xmm0
add    $0x1,%rax
add    $0xffffffffffffffff,%r9
cmp    %rsi,%rax
jne    1140 <streamtod+0x40>
mov    %rsi,%rax
jmp    11e0 <streamtod+0xe0>
xorpd  %xmm0,%xmm0
mov    %rsi,%rax
jmp    11ed <streamtod+0xed>
add    $0x1,%rax
cmp    %rsi,%rax
jne    1123 <streamtod+0x23>
xorpd  %xmm0,%xmm0
mov    %rsi,%rax
jmp    11e0 <streamtod+0xe0>
cmp    $0x2e,%cl
jne    11e0 <streamtod+0xe0>
lea    0x1(%rax),%r10
cmp    %rsi,%r10
je     116b <streamtod+0x6b>
add    %r9,%rax
movsd  0xe5c(%rip),%xmm1
movapd %xmm1,%xmm2
nopl   0x0(%rax,%rax,1)
movzbl (%r10),%edi
lea    -0x30(%rdi),%ecx
cmp    $0x9,%cl
ja     11dd <streamtod+0xdd>
add    $0xffffffd0,%edi
xorps  %xmm3,%xmm3
cvtsi2sd %edi,%xmm3
mulsd  %xmm2,%xmm3
addsd  %xmm3,%xmm0
mulsd  %xmm1,%xmm2
add    $0x1,%r10
cmp    %rsi,%r10
jne    11b0 <streamtod+0xb0>
jmp    11e0 <streamtod+0xe0>
mov    %r10,%rax
test   %r8b,%r8b
jne    11ed <streamtod+0xed>
xorpd  0xe23(%rip),%xmm0
cmp    %rsi,%rax
je     1295 <streamtod+0x195>
mov    (%rax),%cl
or     $0x20,%cl
cmp    $0x65,%cl
jne    1287 <streamtod+0x187>
mov    0x1(%rax),%cl
mov    $0x1,%r8b
cmp    $0x2b,%cl
je     128c <streamtod+0x18c>
cmp    $0x2d,%cl
jne    129d <streamtod+0x19d>
add    $0x2,%rax
xor    %r8d,%r8d
cmp    %rsi,%rax
je     1295 <streamtod+0x195>
xor    %r9d,%r9d
nopl   0x0(%rax,%rax,1)
movzbl (%rax),%ecx
lea    -0x30(%rcx),%edi
cmp    $0x9,%dil
ja     1254 <streamtod+0x154>
lea    (%r9,%r9,4),%edi
lea    (%rcx,%rdi,2),%r9d
add    $0xffffffd0,%r9d
add    $0x1,%rax
cmp    %rsi,%rax
jne    1230 <streamtod+0x130>
mov    %rsi,%rax
test   %r9d,%r9d
je     1287 <streamtod+0x187>
cmp    $0x2,%r9d
jl     12ac <streamtod+0x1ac>
add    $0x1,%r9d
movsd  0xd9d(%rip),%xmm2
movapd %xmm2,%xmm1
nop
mulsd  %xmm2,%xmm1
add    $0xffffffff,%r9d
cmp    $0x2,%r9d
ja     1270 <streamtod+0x170>
test   %r8b,%r8b
je     12b9 <streamtod+0x1b9>
mulsd  %xmm1,%xmm0
movsd  %xmm0,(%rdx)
ret
add    $0x2,%rax
cmp    %rsi,%rax
jne    1228 <streamtod+0x128>
mov    %rsi,%rax
movsd  %xmm0,(%rdx)
ret
add    $0x1,%rax
cmp    %rsi,%rax
jne    1228 <streamtod+0x128>
jmp    1295 <streamtod+0x195>
movsd  0xd54(%rip),%xmm1
test   %r8b,%r8b
jne    1283 <streamtod+0x183>
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rdx)
ret

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

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