int ffr4fi4(float *input, long ntodo, double scale, double zero, int *output,
            int *status) {
  long ii;
  double dvalue;
  if (scale == 1. && zero == 0.) {
    for (ii = 0; ii < ntodo; ii++) {
      if (input[ii] < -2147483648.49) {
        *status = -11;
        output[ii] = (-2147483647 - 1);
      } else if (input[ii] > 2147483647.49) {
        *status = -11;
        output[ii] = 2147483647;
      } else
        output[ii] = (int)input[ii];
    }
  } else {
    for (ii = 0; ii < ntodo; ii++) {
      dvalue = (input[ii] - zero) / scale;
      if (dvalue < -2147483648.49) {
        *status = -11;
        output[ii] = (-2147483647 - 1);
      } else if (dvalue > 2147483647.49) {
        *status = -11;
        output[ii] = 2147483647;
      } else {
        if (dvalue >= 0)
          output[ii] = (int)(dvalue + .5);
        else
          output[ii] = (int)(dvalue - .5);
      }
    }
  }
  return (*status);
}


x86 assembly (clang, -O0):
<ffr4fi4>:
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    1223 <ffr4fi4+0x123>
jp     1223 <ffr4fi4+0x123>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1223 <ffr4fi4+0x123>
jp     1223 <ffr4fi4+0x123>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    121e <ffr4fi4+0x11e>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe86(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    11aa <ffr4fi4+0xaa>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
movl   $0x80000000,(%rax,%rcx,4)
jmp    1208 <ffr4fi4+0x108>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe4d(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11eb <ffr4fi4+0xeb>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
movl   $0x7fffffff,(%rax,%rcx,4)
jmp    1203 <ffr4fi4+0x103>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
cvttss2si (%rax,%rcx,4),%edx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1208 <ffr4fi4+0x108>
jmp    120d <ffr4fi4+0x10d>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    115b <ffr4fi4+0x5b>
jmp    1337 <ffr4fi4+0x237>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    1332 <ffr4fi4+0x232>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
subsd  -0x20(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xda7(%rip),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    128a <ffr4fi4+0x18a>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
movl   $0x80000000,(%rax,%rcx,4)
jmp    131c <ffr4fi4+0x21c>
movsd  -0x40(%rbp),%xmm0
movsd  0xd79(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    12bf <ffr4fi4+0x1bf>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
movl   $0x7fffffff,(%rax,%rcx,4)
jmp    1317 <ffr4fi4+0x217>
movsd  -0x40(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     12f2 <ffr4fi4+0x1f2>
movsd  0xd3f(%rip),%xmm0
addsd  -0x40(%rbp),%xmm0
cvttsd2si %xmm0,%edx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1312 <ffr4fi4+0x212>
movsd  -0x40(%rbp),%xmm0
movsd  0xd19(%rip),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1317 <ffr4fi4+0x217>
jmp    131c <ffr4fi4+0x21c>
jmp    1321 <ffr4fi4+0x221>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    122b <ffr4fi4+0x12b>
jmp    1337 <ffr4fi4+0x237>
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ffr4fi4>:
ucomisd 0xef8(%rip),%xmm0
jne    11a7 <ffr4fi4+0xa7>
jp     11a7 <ffr4fi4+0xa7>
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm1
jne    11a7 <ffr4fi4+0xa7>
jp     11a7 <ffr4fi4+0xa7>
test   %rsi,%rsi
jle    1247 <ffr4fi4+0x147>
xor    %eax,%eax
movsd  0xecd(%rip),%xmm0
movsd  0xecd(%rip),%xmm1
jmp    116d <ffr4fi4+0x6d>
cs nopw 0x0(%rax,%rax,1)
nop
movl   $0xfffffff5,(%rcx)
mov    $0x80000000,%r8d
mov    %r8d,(%rdx,%rax,4)
add    $0x1,%rax
cmp    %rax,%rsi
je     1247 <ffr4fi4+0x147>
movss  (%rdi,%rax,4),%xmm2
xorps  %xmm3,%xmm3
cvtss2sd %xmm2,%xmm3
ucomisd %xmm3,%xmm0
ja     1150 <ffr4fi4+0x50>
ucomisd %xmm1,%xmm3
jbe    11a0 <ffr4fi4+0xa0>
movl   $0xfffffff5,(%rcx)
mov    $0x7fffffff,%r8d
jmp    115c <ffr4fi4+0x5c>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cvttss2si %xmm2,%r8d
jmp    115c <ffr4fi4+0x5c>
test   %rsi,%rsi
jle    1247 <ffr4fi4+0x147>
xor    %eax,%eax
movsd  0xe4e(%rip),%xmm2
movsd  0xe4e(%rip),%xmm3
xorpd  %xmm4,%xmm4
movsd  0xe52(%rip),%xmm5
movsd  0xe42(%rip),%xmm6
jmp    11f9 <ffr4fi4+0xf9>
nopl   0x0(%rax,%rax,1)
movl   $0xfffffff5,(%rcx)
mov    $0x80000000,%r8d
mov    %r8d,(%rdx,%rax,4)
add    $0x1,%rax
cmp    %rax,%rsi
je     1247 <ffr4fi4+0x147>
movss  (%rdi,%rax,4),%xmm7
cvtss2sd %xmm7,%xmm7
subsd  %xmm1,%xmm7
divsd  %xmm0,%xmm7
ucomisd %xmm7,%xmm2
ja     11e0 <ffr4fi4+0xe0>
ucomisd %xmm3,%xmm7
jbe    1230 <ffr4fi4+0x130>
movl   $0xfffffff5,(%rcx)
mov    $0x7fffffff,%r8d
jmp    11ec <ffr4fi4+0xec>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
ucomisd %xmm4,%xmm7
jae    123c <ffr4fi4+0x13c>
addsd  %xmm5,%xmm7
jmp    1240 <ffr4fi4+0x140>
addsd  %xmm6,%xmm7
cvttsd2si %xmm7,%r8d
jmp    11ec <ffr4fi4+0xec>
mov    (%rcx),%eax
ret

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

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