#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__ pv__isdigit(char const);
double pv_getnum_d(const char *str) {
  double n = 0.0;
  double step = 1;
  if (0 == str)
    return n;
  while (str[0] != 0 && (!pv__isdigit(str[0])))
    str++;
  for (; pv__isdigit(str[0]); str++) {
    n = n * 10;
    n += (str[0] - '0');
  }
  if ((str[0] != '.') && (str[0] != ','))
    return n;
  str++;
  for (; pv__isdigit(str[0]) && step < 1000000; str++) {
    step = step * 10;
    n += (str[0] - '0') / step;
  }
  return n;
}


x86 assembly (clang, -O0):
<pv_getnum_d>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xed4(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
xor    %eax,%eax
cmp    -0x10(%rbp),%rax
jne    114c <pv_getnum_d+0x3c>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12bb <pv_getnum_d+0x1ab>
jmp    1151 <pv_getnum_d+0x41>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x21(%rbp)
je     117e <pv_getnum_d+0x6e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1030 <pv__isdigit@plt>
cmp    $0x0,%rax
setne  %al
xor    $0xff,%al
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%al
test   $0x1,%al
jne    118e <pv_getnum_d+0x7e>
jmp    119f <pv_getnum_d+0x8f>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1151 <pv_getnum_d+0x41>
jmp    11a4 <pv_getnum_d+0x94>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1030 <pv__isdigit@plt>
cmp    $0x0,%rax
je     11f5 <pv_getnum_d+0xe5>
movsd  0xe4e(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    11a4 <pv_getnum_d+0x94>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
je     1224 <pv_getnum_d+0x114>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2c,%eax
je     1224 <pv_getnum_d+0x114>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12bb <pv_getnum_d+0x1ab>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1030 <pv__isdigit@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    $0x0,%rcx
mov    %al,-0x22(%rbp)
je     1261 <pv_getnum_d+0x151>
movsd  0xdb2(%rip),%xmm0
ucomisd -0x20(%rbp),%xmm0
seta   %al
mov    %al,-0x22(%rbp)
mov    -0x22(%rbp),%al
test   $0x1,%al
jne    1271 <pv_getnum_d+0x161>
jmp    12b1 <pv_getnum_d+0x1a1>
movsd  0xd97(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm0
divsd  -0x20(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1230 <pv_getnum_d+0x120>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<pv_getnum_d>:
push   %rbx
sub    $0x10,%rsp
test   %rdi,%rdi
je     114d <pv_getnum_d+0x3d>
mov    %rdi,%rbx
mov    (%rdi),%al
test   %al,%al
je     1149 <pv_getnum_d+0x39>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsbl %al,%edi
call   1030 <pv__isdigit@plt>
test   %rax,%rax
jne    1156 <pv_getnum_d+0x46>
movzbl 0x1(%rbx),%eax
add    $0x1,%rbx
test   %al,%al
jne    1130 <pv_getnum_d+0x20>
xor    %eax,%eax
jmp    1158 <pv_getnum_d+0x48>
xorpd  %xmm0,%xmm0
jmp    123a <pv_getnum_d+0x12a>
mov    (%rbx),%al
movsbl %al,%edi
call   1030 <pv__isdigit@plt>
xorpd  %xmm0,%xmm0
test   %rax,%rax
je     11a5 <pv_getnum_d+0x95>
nopl   0x0(%rax)
movsbl (%rbx),%eax
add    $0xffffffd0,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
mulsd  0xe7b(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rsp)
movsbl 0x1(%rbx),%edi
add    $0x1,%rbx
call   1030 <pv__isdigit@plt>
movsd  (%rsp),%xmm0
test   %rax,%rax
jne    1170 <pv_getnum_d+0x60>
mov    (%rbx),%al
or     $0x2,%al
cmp    $0x2e,%al
jne    123a <pv_getnum_d+0x12a>
movsd  %xmm0,(%rsp)
movsbl 0x1(%rbx),%edi
call   1030 <pv__isdigit@plt>
test   %rax,%rax
je     1235 <pv_getnum_d+0x125>
add    $0x2,%rbx
movsd  0xe38(%rip),%xmm2
movsd  (%rsp),%xmm0
cs nopw 0x0(%rax,%rax,1)
nop
movsbl -0x1(%rbx),%eax
add    $0xffffffd0,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
mulsd  0xe0a(%rip),%xmm2
movsd  %xmm2,0x8(%rsp)
divsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%rsp)
movsbl (%rbx),%edi
call   1030 <pv__isdigit@plt>
test   %rax,%rax
je     1235 <pv_getnum_d+0x125>
add    $0x1,%rbx
movsd  0x8(%rsp),%xmm2
movsd  0xde8(%rip),%xmm0
ucomisd %xmm2,%xmm0
movsd  (%rsp),%xmm0
ja     11e0 <pv_getnum_d+0xd0>
jmp    123a <pv_getnum_d+0x12a>
movsd  (%rsp),%xmm0
add    $0x10,%rsp
pop    %rbx
ret

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

LLVM IR (-O2):
define double @pv_getnum_d(i8* %0) {
%2 = icmp eq i8* %0, null
br i1 %2, label %61, label %3
3: ; preds = %1
%4 = load i8, i8* %0
%5 = icmp eq i8 %4, 0
br i1 %5, label %17, label %6
6: ; preds = %3, %13
%7 = phi i8 [ %15, %13 ], [ %4, %3 ]
%8 = phi i8* [ %14, %13 ], [ %0, %3 ]
%9 = tail call i64 @pv__isdigit(i8 signext %7)
%10 = icmp eq i64 %9, 0
br i1 %10, label %13, label %11
11: ; preds = %6
%12 = load i8, i8* %8
br label %17
13: ; preds = %6
%14 = getelementptr inbounds i8, i8* %8, i64 1
%15 = load i8, i8* %14
%16 = icmp eq i8 %15, 0
br i1 %16, label %17, label %6
17: ; preds = %13, %11, %3
%18 = phi i8 [ 0, %3 ], [ %12, %11 ], [ 0, %13 ]
%19 = phi i8* [ %0, %3 ], [ %8, %11 ], [ %14, %13 ]
%20 = tail call i64 @pv__isdigit(i8 signext %18)
%21 = icmp eq i64 %20, 0
br i1 %21, label %35, label %22
22: ; preds = %17, %22
%23 = phi double [ %30, %22 ], [ 0.000000e+00, %17 ]
%24 = phi i8* [ %31, %22 ], [ %19, %17 ]
%25 = fmul double %23, 1.000000e+01
%26 = load i8, i8* %24
%27 = sext i8 %26 to i32
%28 = add nsw i32 %27, -48
%29 = sitofp i32 %28 to double
%30 = fadd double %25, %29
%31 = getelementptr inbounds i8, i8* %24, i64 1
%32 = load i8, i8* %31
%33 = tail call i64 @pv__isdigit(i8 signext %32)
%34 = icmp eq i64 %33, 0
br i1 %34, label %35, label %22
35: ; preds = %22, %17
%36 = phi i8* [ %19, %17 ], [ %31, %22 ]
%37 = phi double [ 0.000000e+00, %17 ], [ %30, %22 ]
%38 = load i8, i8* %36
switch i8 %38, label %61 [
i8 46, label %39
i8 44, label %39
]
39: ; preds = %35, %35
%40 = getelementptr inbounds i8, i8* %36, i64 1
%41 = load i8, i8* %40
%42 = tail call i64 @pv__isdigit(i8 signext %41)
%43 = icmp eq i64 %42, 0
br i1 %43, label %61, label %44
44: ; preds = %39, %44
%45 = phi i8* [ %55, %44 ], [ %40, %39 ]
%46 = phi double [ %48, %44 ], [ 1.000000e+00, %39 ]
%47 = phi double [ %54, %44 ], [ %37, %39 ]
%48 = fmul double %46, 1.000000e+01
%49 = load i8, i8* %45
%50 = sext i8 %49 to i32
%51 = add nsw i32 %50, -48
%52 = sitofp i32 %51 to double
%53 = fdiv double %52, %48
%54 = fadd double %47, %53
%55 = getelementptr inbounds i8, i8* %45, i64 1
%56 = load i8, i8* %55
%57 = tail call i64 @pv__isdigit(i8 signext %56)
%58 = icmp ne i64 %57, 0
%59 = fcmp olt double %48, 1.000000e+06
%60 = select i1 %58, i1 %59, i1 false
br i1 %60, label %44, label %61
61: ; preds = %44, %39, %35, %1
%62 = phi double [ 0.000000e+00, %1 ], [ %37, %35 ], [ %37, %39 ], [ %54, %44 ]
ret double %62
}