#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 */
scalar_t__ opa_isdigit(char const);
int opa_atof64(const char *str, int len, double *result) {
  if (len <= 0) {
    return -1;
  }
  double sign = 1.0;
  int i = 0;
  if (str[i] == '-') {
    sign = -1.0;
    i++;
  }
  double d = 0.0;
  for (; i < len && opa_isdigit(str[i]); i++) {
    d = (10.0 * d) + (double)(str[i] - '0');
  }
  d *= sign;
  if (i == len) {
    *result = d;
    return 0;
  }
  if (str[i] == '.') {
    i++;
    double b = 0.1;
    double frac = 0;
    for (; i < len && opa_isdigit(str[i]); i++) {
      frac += b * (str[i] - '0');
      b /= 10.0;
    }
    d += (frac * sign);
    if (i == len) {
      *result = d;
      return 0;
    }
  }
  if (str[i] == 'e' || str[i] == 'E') {
    i++;
    int exp_sign = 1;
    if (str[i] == '-') {
      exp_sign = -1;
      i++;
    } else if (str[i] == '+') {
      i++;
    }
    int e = 0;
    for (; i < len && opa_isdigit(str[i]); i++) {
      e = 10 * e + (int)(str[i] - '0');
    }
    if (i == len) {
      int x = 1;
      for (; e > 0; e--) {
        x *= 10;
      }
      *result = d * (double)(exp_sign * x);
      return 0;
    }
  }
  return -2;
}


x86 assembly (clang, -O0):
<opa_atof64>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
cmpl   $0x0,-0x14(%rbp)
jg     1139 <opa_atof64+0x29>
movl   $0xffffffff,-0x4(%rbp)
jmp    1484 <opa_atof64+0x374>
movsd  0xebf(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    1178 <opa_atof64+0x68>
movsd  0xe9e(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x2c(%rbp),%ecx
xor    %eax,%eax
cmp    -0x14(%rbp),%ecx
mov    %al,-0x55(%rbp)
jge    11ac <opa_atof64+0x9c>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <opa_isdigit@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x55(%rbp)
mov    -0x55(%rbp),%al
test   $0x1,%al
jne    11bc <opa_atof64+0xac>
jmp    11f7 <opa_atof64+0xe7>
movsd  -0x38(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xe3c(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1180 <opa_atof64+0x70>
movsd  -0x28(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jne    122b <opa_atof64+0x11b>
movsd  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1484 <opa_atof64+0x374>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    132e <opa_atof64+0x21e>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
movsd  0xdbf(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x2c(%rbp),%ecx
xor    %eax,%eax
cmp    -0x14(%rbp),%ecx
mov    %al,-0x56(%rbp)
jge    128a <opa_atof64+0x17a>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <opa_isdigit@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x56(%rbp)
mov    -0x56(%rbp),%al
test   $0x1,%al
jne    129a <opa_atof64+0x18a>
jmp    12e8 <opa_atof64+0x1d8>
movsd  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm2
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  0xd47(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    125e <opa_atof64+0x14e>
movsd  -0x48(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm2
movsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jne    1329 <opa_atof64+0x219>
movsd  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1484 <opa_atof64+0x374>
jmp    132e <opa_atof64+0x21e>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x65,%eax
je     1358 <opa_atof64+0x248>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x45,%eax
jne    147d <opa_atof64+0x36d>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
movl   $0x1,-0x4c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    1392 <opa_atof64+0x282>
movl   $0xffffffff,-0x4c(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    13b5 <opa_atof64+0x2a5>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2b,%eax
jne    13b0 <opa_atof64+0x2a0>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    13b5 <opa_atof64+0x2a5>
movl   $0x0,-0x50(%rbp)
mov    -0x2c(%rbp),%ecx
xor    %eax,%eax
cmp    -0x14(%rbp),%ecx
mov    %al,-0x57(%rbp)
jge    13e8 <opa_atof64+0x2d8>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <opa_isdigit@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x57(%rbp)
mov    -0x57(%rbp),%al
test   $0x1,%al
jne    13f8 <opa_atof64+0x2e8>
jmp    141e <opa_atof64+0x30e>
imul   $0xa,-0x50(%rbp),%eax
mov    -0x10(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x50(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    13bc <opa_atof64+0x2ac>
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jne    1478 <opa_atof64+0x368>
movl   $0x1,-0x54(%rbp)
cmpl   $0x0,-0x50(%rbp)
jle    1450 <opa_atof64+0x340>
imul   $0xa,-0x54(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x50(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x50(%rbp)
jmp    1431 <opa_atof64+0x321>
movsd  -0x38(%rbp),%xmm0
mov    -0x4c(%rbp),%eax
imul   -0x54(%rbp),%eax
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1484 <opa_atof64+0x374>
jmp    147d <opa_atof64+0x36d>
movl   $0xfffffffe,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<opa_atof64>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
test   %esi,%esi
jle    11ba <opa_atof64+0xaa>
mov    %rdx,%r12
mov    %esi,%r13d
mov    %rdi,%r14
mov    (%rdi),%al
xor    %ebp,%ebp
cmp    $0x2d,%al
sete   %bpl
lea    0xec0(%rip),%rcx
movsd  (%rcx,%rbp,8),%xmm0
xorpd  %xmm1,%xmm1
cmp    %esi,%ebp
jae    11d1 <opa_atof64+0xc1>
movsd  %xmm0,0x10(%rsp)
xor    %ebp,%ebp
cmp    $0x2d,%al
sete   %bpl
mov    %r13d,%ebx
xorpd  %xmm1,%xmm1
cs nopw 0x0(%rax,%rax,1)
movsd  %xmm1,0x8(%rsp)
movsbl (%r14,%rbp,1),%edi
call   1030 <opa_isdigit@plt>
test   %rax,%rax
je     11c5 <opa_atof64+0xb5>
movsbl (%r14,%rbp,1),%eax
add    $0xffffffd0,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  0x8(%rsp),%xmm1
mulsd  0xe9e(%rip),%xmm1
addsd  %xmm0,%xmm1
add    $0x1,%rbp
cmp    %rbp,%rbx
jne    1170 <opa_atof64+0x60>
mulsd  0x10(%rsp),%xmm1
jmp    14ab <opa_atof64+0x39b>
mov    $0xffffffff,%r15d
jmp    14b4 <opa_atof64+0x3a4>
movsd  0x8(%rsp),%xmm1
movsd  0x10(%rsp),%xmm0
mulsd  %xmm0,%xmm1
cmp    %r13d,%ebp
je     14ab <opa_atof64+0x39b>
mov    %ebp,%eax
cmpb   $0x2e,(%r14,%rax,1)
jne    12a6 <opa_atof64+0x196>
add    $0x1,%ebp
xorpd  %xmm2,%xmm2
cmp    %r13d,%ebp
jge    1295 <opa_atof64+0x185>
movsd  %xmm0,0x10(%rsp)
movsd  %xmm1,0x8(%rsp)
mov    %ebp,%ebx
add    %r14,%rbx
movsd  0xe34(%rip),%xmm1
xorpd  %xmm2,%xmm2
nopl   0x0(%rax,%rax,1)
movsd  %xmm1,0x20(%rsp)
movsd  %xmm2,0x18(%rsp)
movsbl (%rbx),%edi
call   1030 <opa_isdigit@plt>
test   %rax,%rax
je     1283 <opa_atof64+0x173>
movsbl (%rbx),%eax
add    $0xffffffd0,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  0x20(%rsp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0x18(%rsp),%xmm2
addsd  %xmm0,%xmm2
divsd  0xdde(%rip),%xmm1
add    $0x1,%ebp
add    $0x1,%rbx
cmp    %r13d,%ebp
jl     1220 <opa_atof64+0x110>
mulsd  0x10(%rsp),%xmm2
movsd  0x8(%rsp),%xmm1
addsd  %xmm2,%xmm1
jmp    14ab <opa_atof64+0x39b>
movsd  0x8(%rsp),%xmm1
movsd  0x10(%rsp),%xmm0
movsd  0x18(%rsp),%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm2,%xmm1
cmp    %r13d,%ebp
je     14ab <opa_atof64+0x39b>
movslq %ebp,%rdx
mov    (%r14,%rdx,1),%al
mov    $0xfffffffe,%r15d
or     $0x20,%al
cmp    $0x65,%al
jne    14b4 <opa_atof64+0x3a4>
mov    0x1(%r14,%rdx,1),%al
mov    $0x1,%ecx
cmp    $0x2b,%al
movsd  %xmm1,0x8(%rsp)
je     12df <opa_atof64+0x1cf>
cmp    $0x2d,%al
jne    12e6 <opa_atof64+0x1d6>
add    $0x2,%ebp
mov    $0xffffffff,%ecx
jmp    12e2 <opa_atof64+0x1d2>
add    $0x2,%ebp
mov    %ebp,%edx
jmp    12ea <opa_atof64+0x1da>
add    $0x1,%rdx
mov    %ecx,0x20(%rsp)
mov    %r12,0x18(%rsp)
xor    %ebp,%ebp
cmp    %r13d,%edx
jge    1341 <opa_atof64+0x231>
mov    %rdx,0x10(%rsp)
movslq %edx,%rax
movslq %r13d,%rbx
add    %rax,%r14
sub    %rax,%rbx
xor    %r12d,%r12d
xor    %ebp,%ebp
movsbl (%r14,%r12,1),%edi
call   1030 <opa_isdigit@plt>
test   %rax,%rax
je     1339 <opa_atof64+0x229>
lea    0x0(%rbp,%rbp,4),%eax
movsbl (%r14,%r12,1),%ecx
lea    (%rcx,%rax,2),%ebp
add    $0xffffffd0,%ebp
add    $0x1,%r12
cmp    %r12,%rbx
jne    1310 <opa_atof64+0x200>
jmp    134a <opa_atof64+0x23a>
mov    0x10(%rsp),%rdx
add    %r12d,%edx
cmp    %r13d,%edx
jne    14b4 <opa_atof64+0x3a4>
mov    $0x1,%ecx
test   %ebp,%ebp
jle    136c <opa_atof64+0x25c>
cmp    $0x8,%ebp
jae    1380 <opa_atof64+0x270>
mov    0x18(%rsp),%r12
movsd  0x8(%rsp),%xmm1
mov    0x20(%rsp),%eax
jmp    148d <opa_atof64+0x37d>
mov    0x18(%rsp),%r12
movsd  0x8(%rsp),%xmm1
mov    0x20(%rsp),%eax
jmp    149d <opa_atof64+0x38d>
mov    %ebp,%eax
and    $0xfffffff8,%eax
lea    -0x8(%rax),%esi
mov    %esi,%edx
shr    $0x3,%edx
add    $0x1,%edx
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x38,%esi
jae    13a8 <opa_atof64+0x298>
movdqa 0xc6e(%rip),%xmm0
movdqa %xmm0,%xmm1
jmp    13fb <opa_atof64+0x2eb>
and    $0xfffffff8,%edx
movdqa 0xc5d(%rip),%xmm0
movdqa 0xc65(%rip),%xmm2
movdqa %xmm0,%xmm1
nop
pshufd $0xf5,%xmm0,%xmm3
pmuludq %xmm2,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pmuludq %xmm2,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm0
pshufd $0xf5,%xmm1,%xmm3
pmuludq %xmm2,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm2,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm1
add    $0xfffffff8,%edx
jne    13c0 <opa_atof64+0x2b0>
test   %ecx,%ecx
je     144b <opa_atof64+0x33b>
movdqa 0xc29(%rip),%xmm2
nopw   0x0(%rax,%rax,1)
pshufd $0xf5,%xmm0,%xmm3
pmuludq %xmm2,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pmuludq %xmm2,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm0
pshufd $0xf5,%xmm1,%xmm3
pmuludq %xmm2,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm2,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm1
add    $0xffffffff,%ecx
jne    1410 <opa_atof64+0x300>
pshufd $0xf5,%xmm0,%xmm2
pshufd $0xf5,%xmm1,%xmm3
pmuludq %xmm2,%xmm3
pmuludq %xmm0,%xmm1
pshufd $0xee,%xmm1,%xmm0
pmuludq %xmm1,%xmm0
pshufd $0xaa,%xmm3,%xmm1
pmuludq %xmm3,%xmm1
pmuludq %xmm0,%xmm1
movd   %xmm1,%ecx
cmp    %eax,%ebp
mov    0x18(%rsp),%r12
movsd  0x8(%rsp),%xmm1
mov    0x20(%rsp),%eax
je     149d <opa_atof64+0x38d>
and    $0x7,%ebp
add    $0x1,%ebp
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%ecx
add    $0xffffffff,%ebp
cmp    $0x1,%ebp
ja     1490 <opa_atof64+0x380>
imul   %eax,%ecx
xorps  %xmm0,%xmm0
cvtsi2sd %ecx,%xmm0
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%r12)
xor    %r15d,%r15d
mov    %r15d,%eax
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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