int imcomp_nullscalefloats(float *fdata, long tilelen, int *idata, double scale,
                           double zero, int nullcheck, float nullflagval,
                           int nullval, int *status) {
  long ii;
  double dvalue;
  if (nullcheck == 1) {
    for (ii = 0; ii < tilelen; ii++) {
      if (fdata[ii] == nullflagval)
        idata[ii] = nullval;
      else {
        dvalue = (fdata[ii] - zero) / scale;
        if (dvalue < -2147483648.49) {
          *status = -11;
          idata[ii] = (-2147483647 - 1);
        } else if (dvalue > 2147483647.49) {
          *status = -11;
          idata[ii] = 2147483647;
        } else {
          if (dvalue >= 0.)
            idata[ii] = (int)(dvalue + .5);
          else
            idata[ii] = (int)(dvalue - .5);
        }
      }
    }
  } else {
    for (ii = 0; ii < tilelen; ii++) {
      dvalue = (fdata[ii] - zero) / scale;
      if (dvalue < -2147483648.49) {
        *status = -11;
        idata[ii] = (-2147483647 - 1);
      } else if (dvalue > 2147483647.49) {
        *status = -11;
        idata[ii] = 2147483647;
      } else {
        if (dvalue >= 0.)
          idata[ii] = (int)(dvalue + .5);
        else
          idata[ii] = (int)(dvalue - .5);
      }
    }
  }
  return (*status);
}


x86 assembly (clang, -O0):
<imcomp_nullscalefloats>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movsd  %xmm0,-0x20(%rbp)
movsd  %xmm1,-0x28(%rbp)
mov    %ecx,-0x2c(%rbp)
movss  %xmm2,-0x30(%rbp)
mov    %r8d,-0x34(%rbp)
mov    %r9,-0x40(%rbp)
cmpl   $0x1,-0x2c(%rbp)
jne    127d <imcomp_nullscalefloats+0x17d>
movq   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    1278 <imcomp_nullscalefloats+0x178>
mov    -0x8(%rbp),%rax
mov    -0x48(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x30(%rbp),%xmm0
jne    117a <imcomp_nullscalefloats+0x7a>
jp     117a <imcomp_nullscalefloats+0x7a>
mov    -0x34(%rbp),%edx
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1262 <imcomp_nullscalefloats+0x162>
mov    -0x8(%rbp),%rax
mov    -0x48(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
subsd  -0x28(%rbp),%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xe5e(%rip),%xmm0
ucomisd -0x50(%rbp),%xmm0
jbe    11cb <imcomp_nullscalefloats+0xcb>
mov    -0x40(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
movl   $0x80000000,(%rax,%rcx,4)
jmp    125d <imcomp_nullscalefloats+0x15d>
movsd  -0x50(%rbp),%xmm0
movsd  0xe30(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1200 <imcomp_nullscalefloats+0x100>
mov    -0x40(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
movl   $0x7fffffff,(%rax,%rcx,4)
jmp    1258 <imcomp_nullscalefloats+0x158>
movsd  -0x50(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1233 <imcomp_nullscalefloats+0x133>
movsd  0xdf6(%rip),%xmm0
addsd  -0x50(%rbp),%xmm0
cvttsd2si %xmm0,%edx
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1253 <imcomp_nullscalefloats+0x153>
movsd  -0x50(%rbp),%xmm0
movsd  0xdd0(%rip),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edx
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1258 <imcomp_nullscalefloats+0x158>
jmp    125d <imcomp_nullscalefloats+0x15d>
jmp    1262 <imcomp_nullscalefloats+0x162>
jmp    1267 <imcomp_nullscalefloats+0x167>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    113c <imcomp_nullscalefloats+0x3c>
jmp    1391 <imcomp_nullscalefloats+0x291>
movq   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    138c <imcomp_nullscalefloats+0x28c>
mov    -0x8(%rbp),%rax
mov    -0x48(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
subsd  -0x28(%rbp),%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xd45(%rip),%xmm0
ucomisd -0x50(%rbp),%xmm0
jbe    12e4 <imcomp_nullscalefloats+0x1e4>
mov    -0x40(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
movl   $0x80000000,(%rax,%rcx,4)
jmp    1376 <imcomp_nullscalefloats+0x276>
movsd  -0x50(%rbp),%xmm0
movsd  0xd17(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1319 <imcomp_nullscalefloats+0x219>
mov    -0x40(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
movl   $0x7fffffff,(%rax,%rcx,4)
jmp    1371 <imcomp_nullscalefloats+0x271>
movsd  -0x50(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     134c <imcomp_nullscalefloats+0x24c>
movsd  0xcdd(%rip),%xmm0
addsd  -0x50(%rbp),%xmm0
cvttsd2si %xmm0,%edx
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    136c <imcomp_nullscalefloats+0x26c>
movsd  -0x50(%rbp),%xmm0
movsd  0xcb7(%rip),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edx
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1371 <imcomp_nullscalefloats+0x271>
jmp    1376 <imcomp_nullscalefloats+0x276>
jmp    137b <imcomp_nullscalefloats+0x27b>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    1285 <imcomp_nullscalefloats+0x185>
jmp    1391 <imcomp_nullscalefloats+0x291>
mov    -0x40(%rbp),%rax
mov    (%rax),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<imcomp_nullscalefloats>:
cmp    $0x1,%ecx
jne    11ac <imcomp_nullscalefloats+0xac>
test   %rsi,%rsi
jle    1246 <imcomp_nullscalefloats+0x146>
xor    %eax,%eax
movsd  0xee4(%rip),%xmm3
movsd  0xee4(%rip),%xmm4
xorpd  %xmm5,%xmm5
movsd  0xee7(%rip),%xmm8
movsd  0xed7(%rip),%xmm7
jmp    1160 <imcomp_nullscalefloats+0x60>
movl   $0xfffffff5,(%r9)
mov    $0x80000000,%ecx
nopw   0x0(%rax,%rax,1)
mov    %ecx,(%rdx,%rax,4)
add    $0x1,%rax
cmp    %rax,%rsi
je     1246 <imcomp_nullscalefloats+0x146>
movss  (%rdi,%rax,4),%xmm6
ucomiss %xmm2,%xmm6
mov    %r8d,%ecx
jne    116f <imcomp_nullscalefloats+0x6f>
jnp    1150 <imcomp_nullscalefloats+0x50>
cvtss2sd %xmm6,%xmm6
subsd  %xmm1,%xmm6
divsd  %xmm0,%xmm6
ucomisd %xmm6,%xmm3
ja     113b <imcomp_nullscalefloats+0x3b>
ucomisd %xmm4,%xmm6
jbe    1195 <imcomp_nullscalefloats+0x95>
movl   $0xfffffff5,(%r9)
mov    $0x7fffffff,%ecx
jmp    1150 <imcomp_nullscalefloats+0x50>
ucomisd %xmm5,%xmm6
jae    11a2 <imcomp_nullscalefloats+0xa2>
addsd  %xmm8,%xmm6
jmp    11a6 <imcomp_nullscalefloats+0xa6>
addsd  %xmm7,%xmm6
cvttsd2si %xmm6,%ecx
jmp    1150 <imcomp_nullscalefloats+0x50>
test   %rsi,%rsi
jle    1246 <imcomp_nullscalefloats+0x146>
xor    %eax,%eax
movsd  0xe41(%rip),%xmm2
movsd  0xe41(%rip),%xmm3
xorpd  %xmm4,%xmm4
movsd  0xe45(%rip),%xmm5
movsd  0xe35(%rip),%xmm6
jmp    11f8 <imcomp_nullscalefloats+0xf8>
nopl   (%rax)
movl   $0xfffffff5,(%r9)
mov    $0x80000000,%ecx
mov    %ecx,(%rdx,%rax,4)
add    $0x1,%rax
cmp    %rax,%rsi
je     1246 <imcomp_nullscalefloats+0x146>
movss  (%rdi,%rax,4),%xmm7
cvtss2sd %xmm7,%xmm7
subsd  %xmm1,%xmm7
divsd  %xmm0,%xmm7
ucomisd %xmm7,%xmm2
ja     11e0 <imcomp_nullscalefloats+0xe0>
ucomisd %xmm3,%xmm7
jbe    1230 <imcomp_nullscalefloats+0x130>
movl   $0xfffffff5,(%r9)
mov    $0x7fffffff,%ecx
jmp    11ec <imcomp_nullscalefloats+0xec>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
ucomisd %xmm4,%xmm7
jae    123c <imcomp_nullscalefloats+0x13c>
addsd  %xmm5,%xmm7
jmp    1240 <imcomp_nullscalefloats+0x140>
addsd  %xmm6,%xmm7
cvttsd2si %xmm7,%ecx
jmp    11ec <imcomp_nullscalefloats+0xec>
mov    (%r9),%eax
ret

LLVM IR (-O0):
define i32 @imcomp_nullscalefloats(float* %0, i64 %1, i32* %2, double %3, double %4, i32 %5, float %6, i32 %7, i32* %8) {
%10 = alloca float*
%11 = alloca i64
%12 = alloca i32*
%13 = alloca double
%14 = alloca double
%15 = alloca i32
%16 = alloca float
%17 = alloca i32
%18 = alloca i32*
%19 = alloca i64
%20 = alloca double
store float* %0, float** %10
store i64 %1, i64* %11
store i32* %2, i32** %12
store double %3, double* %13
store double %4, double* %14
store i32 %5, i32* %15
store float %6, float* %16
store i32 %7, i32* %17
store i32* %8, i32** %18
%21 = load i32, i32* %15
%22 = icmp eq i32 %21, 1
br i1 %22, label %23, label %90
23: ; preds = %9
store i64 0, i64* %19
br label %24
24: ; preds = %86, %23
%25 = load i64, i64* %19
%26 = load i64, i64* %11
%27 = icmp slt i64 %25, %26
br i1 %27, label %28, label %89
28: ; preds = %24
%29 = load float*, float** %10
%30 = load i64, i64* %19
%31 = getelementptr inbounds float, float* %29, i64 %30
%32 = load float, float* %31
%33 = load float, float* %16
%34 = fcmp oeq float %32, %33
br i1 %34, label %35, label %40
35: ; preds = %28
%36 = load i32, i32* %17
%37 = load i32*, i32** %12
%38 = load i64, i64* %19
%39 = getelementptr inbounds i32, i32* %37, i64 %38
store i32 %36, i32* %39
br label %85
40: ; preds = %28
%41 = load float*, float** %10
%42 = load i64, i64* %19
%43 = getelementptr inbounds float, float* %41, i64 %42
%44 = load float, float* %43
%45 = fpext float %44 to double
%46 = load double, double* %14
%47 = fsub double %45, %46
%48 = load double, double* %13
%49 = fdiv double %47, %48
store double %49, double* %20
%50 = load double, double* %20
%51 = fcmp olt double %50, 0xC1E00000000FAE14
br i1 %51, label %52, label %57
52: ; preds = %40
%53 = load i32*, i32** %18
store i32 -11, i32* %53
%54 = load i32*, i32** %12
%55 = load i64, i64* %19
%56 = getelementptr inbounds i32, i32* %54, i64 %55
store i32 -2147483648, i32* %56
br label %84
57: ; preds = %40
%58 = load double, double* %20
%59 = fcmp ogt double %58, 0x41DFFFFFFFDF5C29
br i1 %59, label %60, label %65
60: ; preds = %57
%61 = load i32*, i32** %18
store i32 -11, i32* %61
%62 = load i32*, i32** %12
%63 = load i64, i64* %19
%64 = getelementptr inbounds i32, i32* %62, i64 %63
store i32 2147483647, i32* %64
br label %83
65: ; preds = %57
%66 = load double, double* %20
%67 = fcmp oge double %66, 0.000000e+00
br i1 %67, label %68, label %75
68: ; preds = %65
%69 = load double, double* %20
%70 = fadd double %69, 5.000000e-01
%71 = fptosi double %70 to i32
%72 = load i32*, i32** %12
%73 = load i64, i64* %19
%74 = getelementptr inbounds i32, i32* %72, i64 %73
store i32 %71, i32* %74
br label %82
75: ; preds = %65
%76 = load double, double* %20
%77 = fsub double %76, 5.000000e-01
%78 = fptosi double %77 to i32
%79 = load i32*, i32** %12
%80 = load i64, i64* %19
%81 = getelementptr inbounds i32, i32* %79, i64 %80
store i32 %78, i32* %81
br label %82
82: ; preds = %75, %68
br label %83
83: ; preds = %82, %60
br label %84
84: ; preds = %83, %52
br label %85
85: ; preds = %84, %35
br label %86
86: ; preds = %85
%87 = load i64, i64* %19
%88 = add nsw i64 %87, 1
store i64 %88, i64* %19
br label %24
89: ; preds = %24
br label %144
90: ; preds = %9
store i64 0, i64* %19
br label %91
91: ; preds = %140, %90
%92 = load i64, i64* %19
%93 = load i64, i64* %11
%94 = icmp slt i64 %92, %93
br i1 %94, label %95, label %143
95: ; preds = %91
%96 = load float*, float** %10
%97 = load i64, i64* %19
%98 = getelementptr inbounds float, float* %96, i64 %97
%99 = load float, float* %98
%100 = fpext float %99 to double
%101 = load double, double* %14
%102 = fsub double %100, %101
%103 = load double, double* %13
%104 = fdiv double %102, %103
store double %104, double* %20
%105 = load double, double* %20
%106 = fcmp olt double %105, 0xC1E00000000FAE14
br i1 %106, label %107, label %112
107: ; preds = %95
%108 = load i32*, i32** %18
store i32 -11, i32* %108
%109 = load i32*, i32** %12
%110 = load i64, i64* %19
%111 = getelementptr inbounds i32, i32* %109, i64 %110
store i32 -2147483648, i32* %111
br label %139
112: ; preds = %95
%113 = load double, double* %20
%114 = fcmp ogt double %113, 0x41DFFFFFFFDF5C29
br i1 %114, label %115, label %120
115: ; preds = %112
%116 = load i32*, i32** %18
store i32 -11, i32* %116
%117 = load i32*, i32** %12
%118 = load i64, i64* %19
%119 = getelementptr inbounds i32, i32* %117, i64 %118
store i32 2147483647, i32* %119
br label %138
120: ; preds = %112
%121 = load double, double* %20
%122 = fcmp oge double %121, 0.000000e+00
br i1 %122, label %123, label %130
123: ; preds = %120
%124 = load double, double* %20
%125 = fadd double %124, 5.000000e-01
%126 = fptosi double %125 to i32
%127 = load i32*, i32** %12
%128 = load i64, i64* %19
%129 = getelementptr inbounds i32, i32* %127, i64 %128
store i32 %126, i32* %129
br label %137
130: ; preds = %120
%131 = load double, double* %20
%132 = fsub double %131, 5.000000e-01
%133 = fptosi double %132 to i32
%134 = load i32*, i32** %12
%135 = load i64, i64* %19
%136 = getelementptr inbounds i32, i32* %134, i64 %135
store i32 %133, i32* %136
br label %137
137: ; preds = %130, %123
br label %138
138: ; preds = %137, %115
br label %139
139: ; preds = %138, %107
br label %140
140: ; preds = %139
%141 = load i64, i64* %19
%142 = add nsw i64 %141, 1
store i64 %142, i64* %19
br label %91
143: ; preds = %91
br label %144
144: ; preds = %143, %89
%145 = load i32*, i32** %18
%146 = load i32, i32* %145
ret i32 %146
}

LLVM IR (-O2):
define i32 @imcomp_nullscalefloats(float* nocapture %0, i64 %1, i32* nocapture writeonly %2, double %3, double %4, i32 %5, float %6, i32 %7, i32* nocapture %8) {
%10 = icmp eq i32 %5, 1
%11 = icmp sgt i64 %1, 0
br i1 %10, label %13, label %12
12: ; preds = %9
br i1 %11, label %41, label %66
13: ; preds = %9
br i1 %11, label %14, label %66
14: ; preds = %13, %36
%15 = phi i64 [ %39, %36 ], [ 0, %13 ]
%16 = getelementptr inbounds float, float* %0, i64 %15
%17 = load float, float* %16
%18 = fcmp oeq float %17, %6
br i1 %18, label %36, label %19
19: ; preds = %14
%20 = fpext float %17 to double
%21 = fsub double %20, %4
%22 = fdiv double %21, %3
%23 = fcmp olt double %22, 0xC1E00000000FAE14
br i1 %23, label %24, label %25
24: ; preds = %19
store i32 -11, i32* %8
br label %36
25: ; preds = %19
%26 = fcmp ogt double %22, 0x41DFFFFFFFDF5C29
br i1 %26, label %27, label %28
27: ; preds = %25
store i32 -11, i32* %8
br label %36
28: ; preds = %25
%29 = fcmp ult double %22, 0.000000e+00
br i1 %29, label %33, label %30
30: ; preds = %28
%31 = fadd double %22, 5.000000e-01
%32 = fptosi double %31 to i32
br label %36
33: ; preds = %28
%34 = fadd double %22, -5.000000e-01
%35 = fptosi double %34 to i32
br label %36
36: ; preds = %14, %27, %33, %30, %24
%37 = phi i32 [ 2147483647, %27 ], [ %35, %33 ], [ %32, %30 ], [ -2147483648, %24 ], [ %7, %14 ]
%38 = getelementptr inbounds i32, i32* %2, i64 %15
store i32 %37, i32* %38
%39 = add nuw nsw i64 %15, 1
%40 = icmp eq i64 %39, %1
br i1 %40, label %66, label %14
41: ; preds = %12, %61
%42 = phi i64 [ %64, %61 ], [ 0, %12 ]
%43 = getelementptr inbounds float, float* %0, i64 %42
%44 = load float, float* %43
%45 = fpext float %44 to double
%46 = fsub double %45, %4
%47 = fdiv double %46, %3
%48 = fcmp olt double %47, 0xC1E00000000FAE14
br i1 %48, label %49, label %50
49: ; preds = %41
store i32 -11, i32* %8
br label %61
50: ; preds = %41
%51 = fcmp ogt double %47, 0x41DFFFFFFFDF5C29
br i1 %51, label %52, label %53
52: ; preds = %50
store i32 -11, i32* %8
br label %61
53: ; preds = %50
%54 = fcmp ult double %47, 0.000000e+00
br i1 %54, label %58, label %55
55: ; preds = %53
%56 = fadd double %47, 5.000000e-01
%57 = fptosi double %56 to i32
br label %61
58: ; preds = %53
%59 = fadd double %47, -5.000000e-01
%60 = fptosi double %59 to i32
br label %61
61: ; preds = %49, %55, %58, %52
%62 = phi i32 [ -2147483648, %49 ], [ %57, %55 ], [ %60, %58 ], [ 2147483647, %52 ]
%63 = getelementptr inbounds i32, i32* %2, i64 %42
store i32 %62, i32* %63
%64 = add nuw nsw i64 %42, 1
%65 = icmp eq i64 %64, %1
br i1 %65, label %66, label %41
66: ; preds = %61, %36, %12, %13
%67 = load i32, i32* %8
ret i32 %67
}