double str2dbl(char *dblStr) {
  int i = 0;
  double w = 0;
  double f = 0;
  double sign = 1;
  double p = 1;
  if (dblStr[i] == 0)
    return 0;
  if (dblStr[i] == '-') {
    sign = -1;
    i++;
  }
  if (!(dblStr[i] && (dblStr[i] >= '0' && dblStr[i] <= '9')))
    return 0;
  while (1) {
    w += dblStr[i] - '0';
    i++;
    if (!dblStr[i])
      return w * sign;
    if (!(dblStr[i] >= '0' && dblStr[i] <= '9'))
      break;
    w = w * 10;
  }
  if (dblStr[i] != '.')
    return 0.0;
  i++;
  if (!(dblStr[i] && (dblStr[i] >= '0' && dblStr[i] <= '9')))
    return 0;
  while (1) {
    w += dblStr[i] - '0';
    i++;
    if (!dblStr[i])
      return w + p;
    if (!(dblStr[i] >= '0' && dblStr[i] <= '9'))
      return 0.0;
    p = p / 10.0;
  }
}


x86 assembly (clang, -O0):
<str2dbl>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xed9(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xecc(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    115b <str2dbl+0x5b>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1383 <str2dbl+0x283>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    1186 <str2dbl+0x86>
movsd  0xe90(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     11c5 <str2dbl+0xc5>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     11c5 <str2dbl+0xc5>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    11d2 <str2dbl+0xd2>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1383 <str2dbl+0x283>
jmp    11d7 <str2dbl+0xd7>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    1223 <str2dbl+0x123>
movsd  -0x20(%rbp),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1383 <str2dbl+0x283>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     124d <str2dbl+0x14d>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    1252 <str2dbl+0x152>
jmp    1269 <str2dbl+0x169>
movsd  0xdb6(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    11d7 <str2dbl+0xd7>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
je     128b <str2dbl+0x18b>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1383 <str2dbl+0x283>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     12d3 <str2dbl+0x1d3>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     12d3 <str2dbl+0x1d3>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    12e0 <str2dbl+0x1e0>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1383 <str2dbl+0x283>
jmp    12e5 <str2dbl+0x1e5>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    1331 <str2dbl+0x231>
movsd  -0x20(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1383 <str2dbl+0x283>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     135b <str2dbl+0x25b>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    1368 <str2dbl+0x268>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1383 <str2dbl+0x283>
movsd  -0x38(%rbp),%xmm0
movsd  0xc9b(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    12e5 <str2dbl+0x1e5>
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<str2dbl>:
mov    (%rdi),%cl
xorpd  %xmm0,%xmm0
test   %cl,%cl
je     1223 <str2dbl+0x123>
cmp    $0x2d,%cl
jne    1125 <str2dbl+0x25>
mov    0x1(%rdi),%cl
movsd  0xeea(%rip),%xmm2
mov    $0x1,%eax
jmp    112f <str2dbl+0x2f>
movsd  0xed3(%rip),%xmm2
xor    %eax,%eax
lea    -0x30(%rcx),%edx
cmp    $0x9,%dl
ja     1223 <str2dbl+0x123>
movzbl %cl,%ecx
add    $0xffffffd0,%ecx
cvtsi2sd %ecx,%xmm1
mov    %eax,%ecx
mov    0x1(%rcx,%rdi,1),%dl
test   %dl,%dl
je     121b <str2dbl+0x11b>
lea    -0x30(%rdx),%esi
cmp    $0x9,%sil
ja     11a5 <str2dbl+0xa5>
movsd  0xeac(%rip),%xmm3
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movapd %xmm1,%xmm4
movsbl 0x1(%rdi,%rcx,1),%eax
add    $0xffffffd0,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
mulsd  %xmm3,%xmm4
addsd  %xmm4,%xmm1
movzbl 0x2(%rdi,%rcx,1),%edx
test   %dl,%dl
je     121b <str2dbl+0x11b>
lea    -0x30(%rdx),%eax
add    $0x1,%rcx
cmp    $0x9,%al
jbe    1170 <str2dbl+0x70>
mov    %ecx,%eax
cmp    $0x2e,%dl
jne    1223 <str2dbl+0x123>
mov    %eax,%eax
movzbl 0x2(%rax,%rdi,1),%ecx
lea    -0x30(%rcx),%edx
cmp    $0x9,%dl
ja     1223 <str2dbl+0x123>
add    $0xffffffd0,%ecx
xorps  %xmm2,%xmm2
cvtsi2sd %ecx,%xmm2
addsd  %xmm2,%xmm1
mov    0x3(%rax,%rdi,1),%cl
test   %cl,%cl
je     1224 <str2dbl+0x124>
add    %rdi,%rax
add    $0x4,%rax
movsd  0xe22(%rip),%xmm2
movsd  0xe2a(%rip),%xmm3
cs nopw 0x0(%rax,%rax,1)
add    $0xd0,%cl
cmp    $0x9,%cl
ja     1223 <str2dbl+0x123>
divsd  %xmm3,%xmm2
movsbl -0x1(%rax),%ecx
add    $0xffffffd0,%ecx
xorps  %xmm4,%xmm4
cvtsi2sd %ecx,%xmm4
addsd  %xmm4,%xmm1
movzbl (%rax),%ecx
add    $0x1,%rax
test   %cl,%cl
jne    11f0 <str2dbl+0xf0>
jmp    122c <str2dbl+0x12c>
mulsd  %xmm1,%xmm2
movapd %xmm2,%xmm0
ret
movsd  0xdd4(%rip),%xmm2
addsd  %xmm1,%xmm2
jmp    121f <str2dbl+0x11f>

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

LLVM IR (-O2):
define double @str2dbl(i8* nocapture %0) {
%2 = load i8, i8* %0
switch i8 %2, label %6 [
i8 0, label %97
i8 45, label %3
]
3: ; preds = %1
%4 = getelementptr inbounds i8, i8* %0, i64 1
%5 = load i8, i8* %4
br label %6
6: ; preds = %1, %3
%7 = phi i8 [ %5, %3 ], [ %2, %1 ]
%8 = phi i32 [ 1, %3 ], [ 0, %1 ]
%9 = phi double [ -1.000000e+00, %3 ], [ 1.000000e+00, %1 ]
%10 = add i8 %7, -48
%11 = icmp ult i8 %10, 10
br i1 %11, label %12, label %97
12: ; preds = %6
%13 = zext i8 %7 to i32
%14 = add nsw i32 %13, -48
%15 = sitofp i32 %14 to double
%16 = add nuw nsw i32 %8, 1
%17 = zext i32 %16 to i64
%18 = getelementptr inbounds i8, i8* %0, i64 %17
%19 = load i8, i8* %18
%20 = icmp eq i8 %19, 0
br i1 %20, label %27, label %21
21: ; preds = %12
%22 = add i8 %19, -48
%23 = icmp ult i8 %22, 10
br i1 %23, label %24, label %49
24: ; preds = %21
%25 = add nuw nsw i32 %8, 1
%26 = zext i32 %25 to i64
br label %34
27: ; preds = %34, %12
%28 = phi double [ %15, %12 ], [ %44, %34 ]
%29 = fmul double %9, %28
br label %97
30: ; preds = %34
%31 = add nuw nsw i32 %36, 1
%32 = add i8 %47, -48
%33 = icmp ult i8 %32, 10
br i1 %33, label %34, label %49
34: ; preds = %24, %30
%35 = phi double [ %15, %24 ], [ %44, %30 ]
%36 = phi i32 [ %16, %24 ], [ %31, %30 ]
%37 = phi i64 [ %26, %24 ], [ %45, %30 ]
%38 = fmul double %35, 1.000000e+01
%39 = getelementptr inbounds i8, i8* %0, i64 %37
%40 = load i8, i8* %39
%41 = sext i8 %40 to i32
%42 = add nsw i32 %41, -48
%43 = sitofp i32 %42 to double
%44 = fadd double %38, %43
%45 = add nuw i64 %37, 1
%46 = getelementptr inbounds i8, i8* %0, i64 %45
%47 = load i8, i8* %46
%48 = icmp eq i8 %47, 0
br i1 %48, label %27, label %30
49: ; preds = %30, %21
%50 = phi i8 [ %19, %21 ], [ %47, %30 ]
%51 = phi double [ %15, %21 ], [ %44, %30 ]
%52 = phi i32 [ %8, %21 ], [ %36, %30 ]
%53 = icmp eq i8 %50, 46
br i1 %53, label %54, label %97
54: ; preds = %49
%55 = add nuw nsw i32 %52, 2
%56 = zext i32 %55 to i64
%57 = getelementptr inbounds i8, i8* %0, i64 %56
%58 = load i8, i8* %57
%59 = add i8 %58, -48
%60 = icmp ult i8 %59, 10
br i1 %60, label %61, label %97
61: ; preds = %54
%62 = zext i8 %58 to i32
%63 = add nsw i32 %62, -48
%64 = sitofp i32 %63 to double
%65 = fadd double %51, %64
%66 = add nuw nsw i32 %52, 3
%67 = zext i32 %66 to i64
%68 = getelementptr inbounds i8, i8* %0, i64 %67
%69 = load i8, i8* %68
%70 = icmp eq i8 %69, 0
br i1 %70, label %74, label %71
71: ; preds = %61
%72 = zext i32 %52 to i64
%73 = add nuw nsw i64 %72, 3
br label %78
74: ; preds = %85, %61
%75 = phi double [ 1.000000e+00, %61 ], [ %86, %85 ]
%76 = phi double [ %65, %61 ], [ %92, %85 ]
%77 = fadd double %75, %76
br label %97
78: ; preds = %71, %85
%79 = phi i64 [ %73, %71 ], [ %93, %85 ]
%80 = phi i8 [ %69, %71 ], [ %95, %85 ]
%81 = phi double [ %65, %71 ], [ %92, %85 ]
%82 = phi double [ 1.000000e+00, %71 ], [ %86, %85 ]
%83 = add i8 %80, -48
%84 = icmp ult i8 %83, 10
br i1 %84, label %85, label %97
85: ; preds = %78
%86 = fdiv double %82, 1.000000e+01
%87 = getelementptr inbounds i8, i8* %0, i64 %79
%88 = load i8, i8* %87
%89 = sext i8 %88 to i32
%90 = add nsw i32 %89, -48
%91 = sitofp i32 %90 to double
%92 = fadd double %81, %91
%93 = add nuw i64 %79, 1
%94 = getelementptr inbounds i8, i8* %0, i64 %93
%95 = load i8, i8* %94
%96 = icmp eq i8 %95, 0
br i1 %96, label %74, label %78
97: ; preds = %78, %54, %49, %6, %1, %74, %27
%98 = phi double [ %77, %74 ], [ %29, %27 ], [ 0.000000e+00, %1 ], [ 0.000000e+00, %6 ], [ 0.000000e+00, %49 ], [ 0.000000e+00, %54 ], [ 0.000000e+00, %78 ]
ret double %98
}