#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 */
short SHRT_MAX;
short SHRT_MIN;
int ffr8fi2(double *input, long ntodo, double scale, double zero, short *output,
            int *status) {
  long ii;
  double dvalue;
  if (scale == 1. && zero == 0.) {
    for (ii = 0; ii < ntodo; ii++) {
      if (input[ii] < -32768.49) {
        *status = -11;
        output[ii] = SHRT_MIN;
      } else if (input[ii] > 32767.49) {
        *status = -11;
        output[ii] = SHRT_MAX;
      } else
        output[ii] = (short)input[ii];
    }
  } else {
    for (ii = 0; ii < ntodo; ii++) {
      dvalue = (input[ii] - zero) / scale;
      if (dvalue < -32768.49) {
        *status = -11;
        output[ii] = SHRT_MIN;
      } else if (dvalue > 32767.49) {
        *status = -11;
        output[ii] = SHRT_MAX;
      } else {
        if (dvalue >= 0)
          output[ii] = (short)(dvalue + .5);
        else
          output[ii] = (short)(dvalue - .5);
      }
    }
  }
  return (*status);
}


x86 assembly (clang, -O0):
<ffr8fi2>:
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    122d <ffr8fi2+0x12d>
jp     122d <ffr8fi2+0x12d>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    122d <ffr8fi2+0x12d>
jp     122d <ffr8fi2+0x12d>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    1228 <ffr8fi2+0x128>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsd  0xe8f(%rip),%xmm0
ucomisd (%rax,%rcx,8),%xmm0
jbe    11a9 <ffr8fi2+0xa9>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    0x2e4b(%rip),%rax
mov    (%rax),%dx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1212 <ffr8fi2+0x112>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  0xe52(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11ed <ffr8fi2+0xed>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    0x2dff(%rip),%rax
mov    (%rax),%dx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    120d <ffr8fi2+0x10d>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
cvttsd2si %xmm0,%eax
mov    %ax,%dx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1212 <ffr8fi2+0x112>
jmp    1217 <ffr8fi2+0x117>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    115b <ffr8fi2+0x5b>
jmp    1357 <ffr8fi2+0x257>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    1352 <ffr8fi2+0x252>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x20(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xda1(%rip),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    1297 <ffr8fi2+0x197>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    0x2d5d(%rip),%rax
mov    (%rax),%dx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    133c <ffr8fi2+0x23c>
movsd  -0x40(%rbp),%xmm0
movsd  0xd6c(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    12d3 <ffr8fi2+0x1d3>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    0x2d19(%rip),%rax
mov    (%rax),%dx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1337 <ffr8fi2+0x237>
movsd  -0x40(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     130e <ffr8fi2+0x20e>
movsd  -0x40(%rbp),%xmm0
movsd  0xd2e(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %ax,%dx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1332 <ffr8fi2+0x232>
movsd  -0x40(%rbp),%xmm0
movsd  0xcfd(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %ax,%dx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1337 <ffr8fi2+0x237>
jmp    133c <ffr8fi2+0x23c>
jmp    1341 <ffr8fi2+0x241>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1235 <ffr8fi2+0x135>
jmp    1357 <ffr8fi2+0x257>
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ffr8fi2>:
ucomisd 0xef8(%rip),%xmm0
jne    1197 <ffr8fi2+0x97>
jp     1197 <ffr8fi2+0x97>
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm1
jne    1197 <ffr8fi2+0x97>
jp     1197 <ffr8fi2+0x97>
test   %rsi,%rsi
jle    1237 <ffr8fi2+0x137>
xor    %eax,%eax
movsd  0xed1(%rip),%xmm0
mov    0x2ea2(%rip),%r8
movsd  0xeca(%rip),%xmm1
mov    0x2e8b(%rip),%r9
jmp    116c <ffr8fi2+0x6c>
nop
movl   $0xfffffff5,(%rcx)
movzwl (%r8),%r10d
mov    %r10w,(%rdx,%rax,2)
add    $0x1,%rax
cmp    %rax,%rsi
je     1237 <ffr8fi2+0x137>
movsd  (%rdi,%rax,8),%xmm2
ucomisd %xmm2,%xmm0
ja     1150 <ffr8fi2+0x50>
ucomisd %xmm1,%xmm2
jbe    1190 <ffr8fi2+0x90>
movl   $0xfffffff5,(%rcx)
movzwl (%r9),%r10d
jmp    115a <ffr8fi2+0x5a>
nopl   0x0(%rax)
cvttsd2si %xmm2,%r10d
jmp    115a <ffr8fi2+0x5a>
test   %rsi,%rsi
jle    1237 <ffr8fi2+0x137>
xor    %eax,%eax
movsd  0xe5e(%rip),%xmm2
mov    0x2e2f(%rip),%r8
movsd  0xe57(%rip),%xmm3
mov    0x2e18(%rip),%r9
xorpd  %xmm4,%xmm4
movsd  0xe54(%rip),%xmm5
movsd  0xe44(%rip),%xmm6
jmp    11f8 <ffr8fi2+0xf8>
cs nopw 0x0(%rax,%rax,1)
movl   $0xfffffff5,(%rcx)
movzwl (%r8),%r10d
mov    %r10w,(%rdx,%rax,2)
add    $0x1,%rax
cmp    %rax,%rsi
je     1237 <ffr8fi2+0x137>
movsd  (%rdi,%rax,8),%xmm7
subsd  %xmm1,%xmm7
divsd  %xmm0,%xmm7
ucomisd %xmm7,%xmm2
ja     11e0 <ffr8fi2+0xe0>
ucomisd %xmm3,%xmm7
jbe    1220 <ffr8fi2+0x120>
movl   $0xfffffff5,(%rcx)
movzwl (%r9),%r10d
jmp    11ea <ffr8fi2+0xea>
nopl   (%rax)
ucomisd %xmm4,%xmm7
jae    122c <ffr8fi2+0x12c>
addsd  %xmm5,%xmm7
jmp    1230 <ffr8fi2+0x130>
addsd  %xmm6,%xmm7
cvttsd2si %xmm7,%r10d
jmp    11ea <ffr8fi2+0xea>
mov    (%rcx),%eax
ret

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

LLVM IR (-O2):
@SHRT_MIN = global i16 0
@SHRT_MAX = global i16 0
define i32 @ffr8fi2(double* nocapture %0, i64 %1, double %2, double %3, i16* 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 %31, label %57
12: ; preds = %6
br i1 %10, label %13, label %57
13: ; preds = %12, %26
%14 = phi i64 [ %29, %26 ], [ 0, %12 ]
%15 = getelementptr inbounds double, double* %0, i64 %14
%16 = load double, double* %15
%17 = fcmp olt double %16, 0xC0E0000FAE147AE1
br i1 %17, label %18, label %20
18: ; preds = %13
store i32 -11, i32* %5
%19 = load i16, i16* @SHRT_MIN
br label %26
20: ; preds = %13
%21 = fcmp ogt double %16, 0x40DFFFDF5C28F5C3
br i1 %21, label %22, label %24
22: ; preds = %20
store i32 -11, i32* %5
%23 = load i16, i16* @SHRT_MAX
br label %26
24: ; preds = %20
%25 = fptosi double %16 to i16
br label %26
26: ; preds = %18, %24, %22
%27 = phi i16 [ %19, %18 ], [ %25, %24 ], [ %23, %22 ]
%28 = getelementptr inbounds i16, i16* %4, i64 %14
store i16 %27, i16* %28
%29 = add nuw nsw i64 %14, 1
%30 = icmp eq i64 %29, %1
br i1 %30, label %57, label %13
31: ; preds = %11, %52
%32 = phi i64 [ %55, %52 ], [ 0, %11 ]
%33 = getelementptr inbounds double, double* %0, i64 %32
%34 = load double, double* %33
%35 = fsub double %34, %3
%36 = fdiv double %35, %2
%37 = fcmp olt double %36, 0xC0E0000FAE147AE1
br i1 %37, label %38, label %40
38: ; preds = %31
store i32 -11, i32* %5
%39 = load i16, i16* @SHRT_MIN
br label %52
40: ; preds = %31
%41 = fcmp ogt double %36, 0x40DFFFDF5C28F5C3
br i1 %41, label %42, label %44
42: ; preds = %40
store i32 -11, i32* %5
%43 = load i16, i16* @SHRT_MAX
br label %52
44: ; preds = %40
%45 = fcmp ult double %36, 0.000000e+00
br i1 %45, label %49, label %46
46: ; preds = %44
%47 = fadd double %36, 5.000000e-01
%48 = fptosi double %47 to i16
br label %52
49: ; preds = %44
%50 = fadd double %36, -5.000000e-01
%51 = fptosi double %50 to i16
br label %52
52: ; preds = %38, %46, %49, %42
%53 = phi i16 [ %39, %38 ], [ %48, %46 ], [ %51, %49 ], [ %43, %42 ]
%54 = getelementptr inbounds i16, i16* %4, i64 %32
store i16 %53, i16* %54
%55 = add nuw nsw i64 %32, 1
%56 = icmp eq i64 %55, %1
br i1 %56, label %57, label %31
57: ; preds = %52, %26, %11, %12
%58 = load i32, i32* %5
ret i32 %58
}