int ffi1fr8(unsigned char *input, long ntodo, double scale, double zero,
            double *output, int *status) {
  long ii;
  if (scale == 1. && zero == 0.) {
    for (ii = 0; ii < ntodo; ii++)
      output[ii] = (double)input[ii];
  } else {
    for (ii = 0; ii < ntodo; ii++)
      output[ii] = (((double)input[ii]) - zero) / scale;
  }
  return (*status);
}


x86 assembly (clang, -O0):
<ffi1fr8>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
movsd  %xmm1,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
mov    %rcx,-0x30(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  0xed5(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    119c <ffi1fr8+0x9c>
jp     119c <ffi1fr8+0x9c>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    119c <ffi1fr8+0x9c>
jp     119c <ffi1fr8+0x9c>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    1197 <ffi1fr8+0x97>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm0
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    115b <ffi1fr8+0x5b>
jmp    11ef <ffi1fr8+0xef>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    11ea <ffi1fr8+0xea>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm0
subsd  -0x20(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    11a4 <ffi1fr8+0xa4>
jmp    11ef <ffi1fr8+0xef>
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ffi1fr8>:
ucomisd 0xef8(%rip),%xmm0
jne    11fc <ffi1fr8+0xfc>
jp     11fc <ffi1fr8+0xfc>
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm1
jne    11fc <ffi1fr8+0xfc>
jp     11fc <ffi1fr8+0xfc>
test   %rsi,%rsi
jle    1478 <ffi1fr8+0x378>
cmp    $0x4,%rsi
jb     1151 <ffi1fr8+0x51>
lea    (%rdi,%rsi,1),%rax
cmp    %rdx,%rax
jbe    12a4 <ffi1fr8+0x1a4>
lea    (%rdx,%rsi,8),%rax
cmp    %rdi,%rax
jbe    12a4 <ffi1fr8+0x1a4>
xor    %r11d,%r11d
mov    %r11,%r8
not    %r8
add    %rsi,%r8
mov    %rsi,%r9
and    $0x3,%r9
je     118c <ffi1fr8+0x8c>
cs nopw 0x0(%rax,%rax,1)
movzbl (%rdi,%r11,1),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%rdx,%r11,8)
add    $0x1,%r11
add    $0xffffffffffffffff,%r9
jne    1170 <ffi1fr8+0x70>
cmp    $0x3,%r8
jb     1478 <ffi1fr8+0x378>
cs nopw 0x0(%rax,%rax,1)
movzbl (%rdi,%r11,1),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%rdx,%r11,8)
movzbl 0x1(%rdi,%r11,1),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,0x8(%rdx,%r11,8)
movzbl 0x2(%rdi,%r11,1),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,0x10(%rdx,%r11,8)
movzbl 0x3(%rdi,%r11,1),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,0x18(%rdx,%r11,8)
add    $0x4,%r11
cmp    %r11,%rsi
jne    11a0 <ffi1fr8+0xa0>
jmp    1478 <ffi1fr8+0x378>
test   %rsi,%rsi
jle    1478 <ffi1fr8+0x378>
cmp    $0x1,%rsi
je     1225 <ffi1fr8+0x125>
lea    (%rdi,%rsi,1),%rax
cmp    %rdx,%rax
jbe    13aa <ffi1fr8+0x2aa>
lea    (%rdx,%rsi,8),%rax
cmp    %rdi,%rax
jbe    13aa <ffi1fr8+0x2aa>
xor    %r11d,%r11d
mov    %r11,%r8
not    %r8
test   $0x1,%sil
je     1252 <ffi1fr8+0x152>
movzbl (%rdi,%r11,1),%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
subsd  %xmm1,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,(%rdx,%r11,8)
or     $0x1,%r11
add    %rsi,%r8
je     1478 <ffi1fr8+0x378>
nopl   0x0(%rax,%rax,1)
movzbl (%rdi,%r11,1),%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
subsd  %xmm1,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,(%rdx,%r11,8)
movzbl 0x1(%rdi,%r11,1),%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
subsd  %xmm1,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,0x8(%rdx,%r11,8)
add    $0x2,%r11
cmp    %r11,%rsi
jne    1260 <ffi1fr8+0x160>
jmp    1478 <ffi1fr8+0x378>
mov    %rsi,%r11
and    $0xfffffffffffffffc,%r11
lea    -0x4(%r11),%rax
mov    %rax,%r9
shr    $0x2,%r9
add    $0x1,%r9
test   %rax,%rax
je     1486 <ffi1fr8+0x386>
mov    %r9,%r10
and    $0xfffffffffffffffe,%r10
xor    %r8d,%r8d
xorpd  %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzwl (%rdi,%r8,1),%eax
movd   %eax,%xmm1
movzwl 0x2(%rdi,%r8,1),%eax
movd   %eax,%xmm2
punpcklbw %xmm0,%xmm1
punpcklwd %xmm0,%xmm1
cvtdq2pd %xmm1,%xmm1
punpcklbw %xmm0,%xmm2
punpcklwd %xmm0,%xmm2
cvtdq2pd %xmm2,%xmm2
movups %xmm1,(%rdx,%r8,8)
movups %xmm2,0x10(%rdx,%r8,8)
movzwl 0x4(%rdi,%r8,1),%eax
movd   %eax,%xmm1
movzwl 0x6(%rdi,%r8,1),%eax
movd   %eax,%xmm2
punpcklbw %xmm0,%xmm1
punpcklwd %xmm0,%xmm1
cvtdq2pd %xmm1,%xmm1
punpcklbw %xmm0,%xmm2
punpcklwd %xmm0,%xmm2
cvtdq2pd %xmm2,%xmm2
movupd %xmm1,0x20(%rdx,%r8,8)
movupd %xmm2,0x30(%rdx,%r8,8)
add    $0x8,%r8
add    $0xfffffffffffffffe,%r10
jne    12e0 <ffi1fr8+0x1e0>
test   $0x1,%r9b
je     139c <ffi1fr8+0x29c>
movzwl (%rdi,%r8,1),%eax
movd   %eax,%xmm0
movzwl 0x2(%rdi,%r8,1),%eax
movd   %eax,%xmm1
xorpd  %xmm2,%xmm2
punpcklbw %xmm2,%xmm0
punpcklwd %xmm2,%xmm0
cvtdq2pd %xmm0,%xmm0
punpcklbw %xmm2,%xmm1
punpcklwd %xmm2,%xmm1
cvtdq2pd %xmm1,%xmm1
movupd %xmm0,(%rdx,%r8,8)
movupd %xmm1,0x10(%rdx,%r8,8)
cmp    %rsi,%r11
je     1478 <ffi1fr8+0x378>
jmp    1154 <ffi1fr8+0x54>
mov    %rsi,%r11
and    $0xfffffffffffffffe,%r11
movapd %xmm1,%xmm2
unpcklpd %xmm1,%xmm2
movapd %xmm0,%xmm3
unpcklpd %xmm0,%xmm3
lea    -0x2(%r11),%r8
mov    %r8,%r9
shr    %r9
add    $0x1,%r9
test   %r8,%r8
je     147b <ffi1fr8+0x37b>
mov    %r9,%r10
and    $0xfffffffffffffffe,%r10
xor    %r8d,%r8d
pxor   %xmm4,%xmm4
cs nopw 0x0(%rax,%rax,1)
movzwl (%rdi,%r8,1),%eax
movd   %eax,%xmm5
punpcklbw %xmm4,%xmm5
punpcklwd %xmm4,%xmm5
cvtdq2pd %xmm5,%xmm5
subpd  %xmm2,%xmm5
divpd  %xmm3,%xmm5
movupd %xmm5,(%rdx,%r8,8)
movzwl 0x2(%rdi,%r8,1),%eax
movd   %eax,%xmm5
punpcklbw %xmm4,%xmm5
punpcklwd %xmm4,%xmm5
cvtdq2pd %xmm5,%xmm5
subpd  %xmm2,%xmm5
divpd  %xmm3,%xmm5
movupd %xmm5,0x10(%rdx,%r8,8)
add    $0x4,%r8
add    $0xfffffffffffffffe,%r10
jne    13f0 <ffi1fr8+0x2f0>
test   $0x1,%r9b
je     146f <ffi1fr8+0x36f>
movzwl (%rdi,%r8,1),%eax
movd   %eax,%xmm4
xorpd  %xmm5,%xmm5
punpcklbw %xmm5,%xmm4
punpcklwd %xmm5,%xmm4
cvtdq2pd %xmm4,%xmm4
subpd  %xmm2,%xmm4
divpd  %xmm3,%xmm4
movupd %xmm4,(%rdx,%r8,8)
cmp    %rsi,%r11
jne    1228 <ffi1fr8+0x128>
mov    (%rcx),%eax
ret
xor    %r8d,%r8d
test   $0x1,%r9b
jne    1448 <ffi1fr8+0x348>
jmp    146f <ffi1fr8+0x36f>
xor    %r8d,%r8d
test   $0x1,%r9b
jne    1360 <ffi1fr8+0x260>
jmp    139c <ffi1fr8+0x29c>

LLVM IR (-O0):
define i32 @ffi1fr8(i8* %0, i64 %1, double %2, double %3, double* %4, i32* %5) {
%7 = alloca i8*
%8 = alloca i64
%9 = alloca double
%10 = alloca double
%11 = alloca double*
%12 = alloca i32*
%13 = alloca i64
store i8* %0, i8** %7
store i64 %1, i64* %8
store double %2, double* %9
store double %3, double* %10
store double* %4, double** %11
store i32* %5, i32** %12
%14 = load double, double* %9
%15 = fcmp oeq double %14, 1.000000e+00
br i1 %15, label %16, label %37
16: ; preds = %6
%17 = load double, double* %10
%18 = fcmp oeq double %17, 0.000000e+00
br i1 %18, label %19, label %37
19: ; preds = %16
store i64 0, i64* %13
br label %20
20: ; preds = %33, %19
%21 = load i64, i64* %13
%22 = load i64, i64* %8
%23 = icmp slt i64 %21, %22
br i1 %23, label %24, label %36
24: ; preds = %20
%25 = load i8*, i8** %7
%26 = load i64, i64* %13
%27 = getelementptr inbounds i8, i8* %25, i64 %26
%28 = load i8, i8* %27
%29 = uitofp i8 %28 to double
%30 = load double*, double** %11
%31 = load i64, i64* %13
%32 = getelementptr inbounds double, double* %30, i64 %31
store double %29, double* %32
br label %33
33: ; preds = %24
%34 = load i64, i64* %13
%35 = add nsw i64 %34, 1
store i64 %35, i64* %13
br label %20
36: ; preds = %20
br label %59
37: ; preds = %16, %6
store i64 0, i64* %13
br label %38
38: ; preds = %55, %37
%39 = load i64, i64* %13
%40 = load i64, i64* %8
%41 = icmp slt i64 %39, %40
br i1 %41, label %42, label %58
42: ; preds = %38
%43 = load i8*, i8** %7
%44 = load i64, i64* %13
%45 = getelementptr inbounds i8, i8* %43, i64 %44
%46 = load i8, i8* %45
%47 = uitofp i8 %46 to double
%48 = load double, double* %10
%49 = fsub double %47, %48
%50 = load double, double* %9
%51 = fdiv double %49, %50
%52 = load double*, double** %11
%53 = load i64, i64* %13
%54 = getelementptr inbounds double, double* %52, i64 %53
store double %51, double* %54
br label %55
55: ; preds = %42
%56 = load i64, i64* %13
%57 = add nsw i64 %56, 1
store i64 %57, i64* %13
br label %38
58: ; preds = %38
br label %59
59: ; preds = %58, %36
%60 = load i32*, i32** %12
%61 = load i32, i32* %60
ret i32 %61
}

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