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


x86 assembly (clang, -O0):
<ffs1fr4>:
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 <ffs1fr4+0x9c>
jp     119c <ffs1fr4+0x9c>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    119c <ffs1fr4+0x9c>
jp     119c <ffs1fr4+0x9c>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    1197 <ffs1fr4+0x97>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cvtsi2ss %eax,%xmm0
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    115b <ffs1fr4+0x5b>
jmp    11f3 <ffs1fr4+0xf3>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    11ee <ffs1fr4+0xee>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm0
subsd  -0x20(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    11a4 <ffs1fr4+0xa4>
jmp    11f3 <ffs1fr4+0xf3>
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ffs1fr4>:
ucomisd 0xef8(%rip),%xmm0
jne    11fc <ffs1fr4+0xfc>
jp     11fc <ffs1fr4+0xfc>
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm1
jne    11fc <ffs1fr4+0xfc>
jp     11fc <ffs1fr4+0xfc>
test   %rsi,%rsi
jle    14d5 <ffs1fr4+0x3d5>
cmp    $0x8,%rsi
jb     1151 <ffs1fr4+0x51>
lea    (%rdi,%rsi,1),%rax
cmp    %rdx,%rax
jbe    12ac <ffs1fr4+0x1ac>
lea    (%rdx,%rsi,4),%rax
cmp    %rdi,%rax
jbe    12ac <ffs1fr4+0x1ac>
xor    %r11d,%r11d
mov    %r11,%r8
not    %r8
add    %rsi,%r8
mov    %rsi,%r9
and    $0x3,%r9
je     118c <ffs1fr4+0x8c>
cs nopw 0x0(%rax,%rax,1)
movsbl (%rdi,%r11,1),%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
movss  %xmm0,(%rdx,%r11,4)
add    $0x1,%r11
add    $0xffffffffffffffff,%r9
jne    1170 <ffs1fr4+0x70>
cmp    $0x3,%r8
jb     14d5 <ffs1fr4+0x3d5>
cs nopw 0x0(%rax,%rax,1)
movsbl (%rdi,%r11,1),%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
movss  %xmm0,(%rdx,%r11,4)
movsbl 0x1(%rdi,%r11,1),%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
movss  %xmm0,0x4(%rdx,%r11,4)
movsbl 0x2(%rdi,%r11,1),%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
movss  %xmm0,0x8(%rdx,%r11,4)
movsbl 0x3(%rdi,%r11,1),%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
movss  %xmm0,0xc(%rdx,%r11,4)
add    $0x4,%r11
cmp    %r11,%rsi
jne    11a0 <ffs1fr4+0xa0>
jmp    14d5 <ffs1fr4+0x3d5>
test   %rsi,%rsi
jle    14d5 <ffs1fr4+0x3d5>
cmp    $0x4,%rsi
jb     1225 <ffs1fr4+0x125>
lea    (%rdi,%rsi,1),%rax
cmp    %rdx,%rax
jbe    13a8 <ffs1fr4+0x2a8>
lea    (%rdx,%rsi,4),%rax
cmp    %rdi,%rax
jbe    13a8 <ffs1fr4+0x2a8>
xor    %r11d,%r11d
mov    %r11,%r8
not    %r8
test   $0x1,%sil
je     1256 <ffs1fr4+0x156>
movsbl (%rdi,%r11,1),%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
subsd  %xmm1,%xmm2
divsd  %xmm0,%xmm2
cvtsd2ss %xmm2,%xmm2
movss  %xmm2,(%rdx,%r11,4)
or     $0x1,%r11
add    %rsi,%r8
je     14d5 <ffs1fr4+0x3d5>
nop
movsbl (%rdi,%r11,1),%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
subsd  %xmm1,%xmm2
divsd  %xmm0,%xmm2
cvtsd2ss %xmm2,%xmm2
movss  %xmm2,(%rdx,%r11,4)
movsbl 0x1(%rdi,%r11,1),%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
subsd  %xmm1,%xmm2
divsd  %xmm0,%xmm2
cvtsd2ss %xmm2,%xmm2
movss  %xmm2,0x4(%rdx,%r11,4)
add    $0x2,%r11
cmp    %r11,%rsi
jne    1260 <ffs1fr4+0x160>
jmp    14d5 <ffs1fr4+0x3d5>
mov    %rsi,%r11
and    $0xfffffffffffffff8,%r11
lea    -0x8(%r11),%rax
mov    %rax,%r9
shr    $0x3,%r9
add    $0x1,%r9
test   %rax,%rax
je     14e3 <ffs1fr4+0x3e3>
mov    %r9,%r10
and    $0xfffffffffffffffe,%r10
xor    %r8d,%r8d
cs nopw 0x0(%rax,%rax,1)
nop
movd   (%rdi,%r8,1),%xmm0
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm0
movd   0x4(%rdi,%r8,1),%xmm1
punpcklbw %xmm1,%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x18,%xmm0
cvtdq2ps %xmm0,%xmm0
psrad  $0x18,%xmm1
cvtdq2ps %xmm1,%xmm1
movups %xmm0,(%rdx,%r8,4)
movups %xmm1,0x10(%rdx,%r8,4)
movd   0x8(%rdi,%r8,1),%xmm0
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm0
movd   0xc(%rdi,%r8,1),%xmm1
punpcklbw %xmm1,%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x18,%xmm0
cvtdq2ps %xmm0,%xmm0
psrad  $0x18,%xmm1
cvtdq2ps %xmm1,%xmm1
movups %xmm0,0x20(%rdx,%r8,4)
movups %xmm1,0x30(%rdx,%r8,4)
add    $0x10,%r8
add    $0xfffffffffffffffe,%r10
jne    12e0 <ffs1fr4+0x1e0>
test   $0x1,%r9b
je     139a <ffs1fr4+0x29a>
movd   (%rdi,%r8,1),%xmm0
movd   0x4(%rdi,%r8,1),%xmm1
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x18,%xmm0
cvtdq2ps %xmm0,%xmm0
punpcklbw %xmm1,%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x18,%xmm1
cvtdq2ps %xmm1,%xmm1
movups %xmm0,(%rdx,%r8,4)
movups %xmm1,0x10(%rdx,%r8,4)
cmp    %rsi,%r11
je     14d5 <ffs1fr4+0x3d5>
jmp    1154 <ffs1fr4+0x54>
mov    %rsi,%r11
and    $0xfffffffffffffffc,%r11
movapd %xmm1,%xmm3
unpcklpd %xmm1,%xmm3
movapd %xmm0,%xmm2
unpcklpd %xmm0,%xmm2
lea    -0x4(%r11),%r8
mov    %r8,%r9
shr    $0x2,%r9
add    $0x1,%r9
test   %r8,%r8
je     14d8 <ffs1fr4+0x3d8>
mov    %r9,%r10
and    $0xfffffffffffffffe,%r10
xor    %r8d,%r8d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movd   (%rdi,%r8,1),%xmm4
punpcklbw %xmm4,%xmm4
punpcklwd %xmm4,%xmm4
psrad  $0x18,%xmm4
pshufd $0xee,%xmm4,%xmm5
cvtdq2pd %xmm5,%xmm5
cvtdq2pd %xmm4,%xmm4
subpd  %xmm3,%xmm4
subpd  %xmm3,%xmm5
divpd  %xmm2,%xmm5
divpd  %xmm2,%xmm4
cvtpd2ps %xmm4,%xmm4
cvtpd2ps %xmm5,%xmm5
unpcklpd %xmm5,%xmm4
movupd %xmm4,(%rdx,%r8,4)
movd   0x4(%rdi,%r8,1),%xmm4
punpcklbw %xmm4,%xmm4
punpcklwd %xmm4,%xmm4
psrad  $0x18,%xmm4
pshufd $0xee,%xmm4,%xmm5
cvtdq2pd %xmm5,%xmm5
cvtdq2pd %xmm4,%xmm4
subpd  %xmm3,%xmm4
subpd  %xmm3,%xmm5
divpd  %xmm2,%xmm5
divpd  %xmm2,%xmm4
cvtpd2ps %xmm4,%xmm4
cvtpd2ps %xmm5,%xmm5
unpcklpd %xmm5,%xmm4
movupd %xmm4,0x10(%rdx,%r8,4)
add    $0x8,%r8
add    $0xfffffffffffffffe,%r10
jne    13f0 <ffs1fr4+0x2f0>
test   $0x1,%r9b
je     14cc <ffs1fr4+0x3cc>
movd   (%rdi,%r8,1),%xmm4
punpcklbw %xmm4,%xmm4
punpcklwd %xmm4,%xmm4
psrad  $0x18,%xmm4
pshufd $0xee,%xmm4,%xmm5
cvtdq2pd %xmm5,%xmm5
cvtdq2pd %xmm4,%xmm4
subpd  %xmm3,%xmm4
subpd  %xmm3,%xmm5
divpd  %xmm2,%xmm5
divpd  %xmm2,%xmm4
cvtpd2ps %xmm4,%xmm2
cvtpd2ps %xmm5,%xmm3
unpcklpd %xmm3,%xmm2
movupd %xmm2,(%rdx,%r8,4)
cmp    %rsi,%r11
jne    1228 <ffs1fr4+0x128>
mov    (%rcx),%eax
ret
xor    %r8d,%r8d
test   $0x1,%r9b
jne    148a <ffs1fr4+0x38a>
jmp    14cc <ffs1fr4+0x3cc>
xor    %r8d,%r8d
test   $0x1,%r9b
jne    1362 <ffs1fr4+0x262>
jmp    139a <ffs1fr4+0x29a>

LLVM IR (-O0):
define i32 @ffs1fr4(i8* %0, i64 %1, double %2, double %3, float* %4, i32* %5) {
%7 = alloca i8*
%8 = alloca i64
%9 = alloca double
%10 = alloca double
%11 = alloca float*
%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 float* %4, float** %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 = sitofp i8 %28 to float
%30 = load float*, float** %11
%31 = load i64, i64* %13
%32 = getelementptr inbounds float, float* %30, i64 %31
store float %29, float* %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 %60
37: ; preds = %16, %6
store i64 0, i64* %13
br label %38
38: ; preds = %56, %37
%39 = load i64, i64* %13
%40 = load i64, i64* %8
%41 = icmp slt i64 %39, %40
br i1 %41, label %42, label %59
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 = sitofp 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 = fptrunc double %51 to float
%53 = load float*, float** %11
%54 = load i64, i64* %13
%55 = getelementptr inbounds float, float* %53, i64 %54
store float %52, float* %55
br label %56
56: ; preds = %42
%57 = load i64, i64* %13
%58 = add nsw i64 %57, 1
store i64 %58, i64* %13
br label %38
59: ; preds = %38
br label %60
60: ; preds = %59, %36
%61 = load i32*, i32** %12
%62 = load i32, i32* %61
ret i32 %62
}

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