double a2d(string, status)
char string[];
long *status;
{
  char *pstring, *pn, *pend;
  double pow10;
  long nsign;
  double number;
  double fraction;
  long exponent;
  long a2l();
  pstring = string;
  while ((((*pstring) == ' ') ? 1 : 0)) {
    pstring++;
  }
  nsign = 1;
  if ((*pstring == '-') || (*pstring == '+')) {
    nsign = ((*pstring == '-') ? -1 : 1);
    pstring++;
  }
  number = 0.0;
  if (((((*pstring) >= '0') && ((*pstring) <= '9')) ? 1 : 0)) {
    pn = pstring;
    while (((((*pn) >= '0') && ((*pn) <= '9')) ? 1 : 0)) {
      pn++;
    }
    pend = pn;
    pow10 = 1.0;
    pn--;
    while (pn >= pstring) {
      number = number + pow10 * ((double)((*pn) - '0'));
      pow10 *= 10.0;
      pn--;
    }
    pstring = pend;
  }
  fraction = 0.0;
  if (*pstring == '.') {
    pstring++;
    pend = pstring;
    while (((((*pend) >= '0') && ((*pend) <= '9')) ? 1 : 0)) {
      pend++;
    }
    pow10 = 0.1;
    while (pstring < pend) {
      fraction = fraction + pow10 * ((double)((*pstring) - '0'));
      pow10 *= 0.1;
      pstring++;
    }
  }
  exponent = 0L;
  if ((*pstring == 'e') || (*pstring == 'E')) {
    pstring++;
    exponent = a2l(pstring, status);
    if (*status != 1L) {
      return (0.0);
    }
  }
  if (!(((((*pstring) >= '0') && ((*pstring) <= '9')) ? 1 : 0) ||
        (*pstring == (char)'\0') || (*pstring == '-') || (*pstring == '+'))) {
    *status = 2L;
    return (0.0);
  }
  number = nsign * (number + fraction);
  if (exponent != 0) {
    pow10 = ((exponent < 0) ? 0.1 : 10.0);
    exponent = ((exponent < 0) ? (0L - exponent) : (exponent));
    for (; exponent > 0; exponent--) {
      number *= pow10;
    }
  }
  *status = 1L;
  return (number);
}


x86 assembly (clang, -O0):
<a2d>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%edx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x20,%edx
cmove  %ecx,%eax
cmp    $0x0,%eax
je     1159 <a2d+0x49>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    112b <a2d+0x1b>
movq   $0x1,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
je     1181 <a2d+0x71>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    11aa <a2d+0x9a>
mov    -0x20(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x2d,%edx
cmove  %ecx,%eax
cltq
mov    %rax,-0x40(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     11e1 <a2d+0xd1>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jg     11e1 <a2d+0xd1>
mov    $0x1,%al
test   $0x1,%al
jne    11f0 <a2d+0xe0>
jmp    12c6 <a2d+0x1b6>
xor    %eax,%eax
test   $0x1,%al
jne    11f0 <a2d+0xe0>
jmp    12c6 <a2d+0x1b6>
mov    -0x20(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x59(%rbp)
jl     121d <a2d+0x10d>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x59(%rbp)
mov    -0x59(%rbp),%dl
xor    %eax,%eax
mov    $0x1,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
cmp    $0x0,%eax
je     1247 <a2d+0x137>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    11f8 <a2d+0xe8>
mov    -0x28(%rbp),%rax
mov    %rax,-0x30(%rbp)
movsd  0xda9(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x28(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jb     12be <a2d+0x1ae>
movsd  -0x48(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0xd6d(%rip),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x28(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x28(%rbp)
jmp    1268 <a2d+0x158>
mov    -0x30(%rbp),%rax
mov    %rax,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    13a9 <a2d+0x299>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x5a(%rbp)
jl     1317 <a2d+0x207>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x5a(%rbp)
mov    -0x5a(%rbp),%dl
xor    %eax,%eax
mov    $0x1,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
cmp    $0x0,%eax
je     1341 <a2d+0x231>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    12f2 <a2d+0x1e2>
movsd  0xcbf(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x20(%rbp),%rax
cmp    -0x30(%rbp),%rax
jae    13a4 <a2d+0x294>
movsd  -0x50(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xc7f(%rip),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    134e <a2d+0x23e>
jmp    13a9 <a2d+0x299>
movq   $0x0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x65,%eax
je     13d1 <a2d+0x2c1>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x45,%eax
jne    1410 <a2d+0x300>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    $0x0,%al
call   1030 <a2l@plt>
mov    %rax,-0x58(%rbp)
mov    -0x18(%rbp),%rax
cmpq   $0x1,(%rax)
je     140b <a2d+0x2fb>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1565 <a2d+0x455>
jmp    1410 <a2d+0x300>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     143f <a2d+0x32f>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jg     143f <a2d+0x32f>
mov    $0x1,%al
test   $0x1,%al
jne    1496 <a2d+0x386>
jmp    144e <a2d+0x33e>
xor    %eax,%eax
test   $0x1,%al
jne    1496 <a2d+0x386>
jmp    144e <a2d+0x33e>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1496 <a2d+0x386>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
je     1496 <a2d+0x386>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
je     1496 <a2d+0x386>
mov    -0x18(%rbp),%rax
movq   $0x2,(%rax)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1565 <a2d+0x455>
cvtsi2sdq -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
addsd  -0x50(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
cmpq   $0x0,-0x58(%rbp)
je     1550 <a2d+0x440>
mov    -0x58(%rbp),%rax
movsd  0xb42(%rip),%xmm0
movsd  0xb42(%rip),%xmm1
movsd  %xmm1,-0x70(%rbp)
cmp    $0x0,%rax
movsd  %xmm0,-0x68(%rbp)
jl     14ec <a2d+0x3dc>
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
cmpq   $0x0,-0x58(%rbp)
jge    1510 <a2d+0x400>
xor    %eax,%eax
sub    -0x58(%rbp),%rax
mov    %rax,-0x78(%rbp)
jmp    1518 <a2d+0x408>
mov    -0x58(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x78(%rbp),%rax
mov    %rax,-0x58(%rbp)
cmpq   $0x0,-0x58(%rbp)
jle    154b <a2d+0x43b>
movsd  -0x38(%rbp),%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x58(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x58(%rbp)
jmp    1520 <a2d+0x410>
jmp    1550 <a2d+0x440>
mov    -0x18(%rbp),%rax
movq   $0x1,(%rax)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<a2d>:
push   %r14
push   %rbx
sub    $0x18,%rsp
mov    %rsi,%r14
nopw   0x0(%rax,%rax,1)
add    $0x1,%rdi
movzbl -0x1(%rdi),%eax
cmp    $0x20,%al
je     1120 <a2d+0x10>
cmp    $0x2b,%al
je     1134 <a2d+0x24>
cmp    $0x2d,%al
jne    114b <a2d+0x3b>
xor    %ecx,%ecx
cmp    $0x2d,%al
sete   %cl
lea    0xebe(%rip),%rax
movsd  (%rax,%rcx,8),%xmm3
mov    (%rdi),%al
jmp    1157 <a2d+0x47>
add    $0xffffffffffffffff,%rdi
movsd  0xec9(%rip),%xmm3
lea    -0x30(%rax),%ecx
xorpd  %xmm4,%xmm4
cmp    $0x9,%cl
ja     118c <a2d+0x7c>
mov    %rdi,%rcx
ja     1180 <a2d+0x70>
mov    %rdi,%rcx
nopl   0x0(%rax,%rax,1)
movzbl 0x1(%rcx),%eax
add    $0x1,%rcx
lea    -0x30(%rax),%edx
cmp    $0xa,%dl
jb     1170 <a2d+0x60>
lea    -0x1(%rcx),%rdx
cmp    %rdi,%rdx
jae    1204 <a2d+0xf4>
mov    %rcx,%rdi
xorpd  %xmm5,%xmm5
cmp    $0x2e,%al
jne    124d <a2d+0x13d>
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movzbl 0x1(%rdi,%rax,1),%ecx
add    $0xd0,%cl
add    $0x1,%rax
cmp    $0xa,%cl
jb     11a0 <a2d+0x90>
lea    0x1(%rdi),%rbx
cmp    $0x2,%rax
jb     1250 <a2d+0x140>
add    %rax,%rdi
movsd  0xe66(%rip),%xmm0
xorpd  %xmm4,%xmm4
movapd %xmm0,%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsbl (%rbx),%eax
add    $0xffffffd0,%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
mulsd  %xmm1,%xmm2
addsd  %xmm2,%xmm4
mulsd  %xmm0,%xmm1
add    $0x1,%rbx
cmp    %rdi,%rbx
jb     11e0 <a2d+0xd0>
jmp    1250 <a2d+0x140>
movsd  0xe14(%rip),%xmm0
xorpd  %xmm5,%xmm5
movsd  0xe10(%rip),%xmm1
nopl   0x0(%rax,%rax,1)
movsbl (%rdx),%esi
add    $0xffffffd0,%esi
xorps  %xmm2,%xmm2
cvtsi2sd %esi,%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm2,%xmm5
mulsd  %xmm1,%xmm0
add    $0xffffffffffffffff,%rdx
cmp    %rdi,%rdx
jae    1220 <a2d+0x110>
mov    %rcx,%rdi
cmp    $0x2e,%al
je     1198 <a2d+0x88>
mov    %rdi,%rbx
mov    (%rbx),%dl
mov    %edx,%eax
or     $0x20,%al
cmp    $0x65,%al
jne    129f <a2d+0x18f>
movsd  %xmm5,(%rsp)
movsd  %xmm4,0x8(%rsp)
movsd  %xmm3,0x10(%rsp)
add    $0x1,%rbx
mov    %rbx,%rdi
mov    %r14,%rsi
xor    %eax,%eax
call   1030 <a2l@plt>
xorpd  %xmm0,%xmm0
cmpq   $0x1,(%r14)
jne    1371 <a2d+0x261>
mov    (%rbx),%dl
movsd  0x10(%rsp),%xmm3
movsd  0x8(%rsp),%xmm4
movsd  (%rsp),%xmm5
jmp    12a1 <a2d+0x191>
xor    %eax,%eax
lea    -0x30(%rdx),%ecx
cmp    $0xa,%cl
jb     12d2 <a2d+0x1c2>
xorpd  %xmm0,%xmm0
mov    $0x2,%ecx
cmp    $0x2d,%dl
ja     136e <a2d+0x25e>
movzbl %dl,%edx
movabs $0x280000000001,%rsi
bt     %rdx,%rsi
jae    136e <a2d+0x25e>
addsd  %xmm4,%xmm5
mulsd  %xmm5,%xmm3
mov    $0x1,%ecx
test   %rax,%rax
je     136a <a2d+0x25a>
mov    %rax,%rdx
neg    %rdx
cmovs  %rax,%rdx
test   %rdx,%rdx
jle    136a <a2d+0x25a>
shr    $0x3f,%rax
lea    0xd0e(%rip),%rsi
movsd  (%rsi,%rax,8),%xmm0
lea    -0x1(%rdx),%rax
mov    %rdx,%rsi
and    $0x7,%rsi
je     1330 <a2d+0x220>
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
mulsd  %xmm0,%xmm3
add    $0x1,%rdi
cmp    %rdi,%rsi
jne    1320 <a2d+0x210>
sub    %rdi,%rdx
cmp    $0x7,%rax
jb     136a <a2d+0x25a>
add    $0xffffffffffffffff,%rdx
nopw   0x0(%rax,%rax,1)
mulsd  %xmm0,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm0,%xmm3
add    $0xfffffffffffffff8,%rdx
cmp    $0xfffffffffffffffe,%rdx
jb     1340 <a2d+0x230>
movapd %xmm3,%xmm0
mov    %rcx,(%r14)
add    $0x18,%rsp
pop    %rbx
pop    %r14
ret

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

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