#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 */
unsigned short SHRT_MAX;
short SHRT_MIN;
int ffu2fi2(unsigned short *input, long ntodo, double scale, double zero,
            short *output, int *status) {
  long ii;
  double dvalue;
  if (scale == 1. && zero == 32768.) {
    for (ii = 0; ii < ntodo; ii++)
      output[ii] = (*(short *)&input[ii]) ^ 0x8000;
  } else if (scale == 1. && zero == 0.) {
    for (ii = 0; ii < ntodo; ii++) {
      if (input[ii] > SHRT_MAX) {
        *status = -11;
        output[ii] = SHRT_MAX;
      } else
        output[ii] = input[ii];
    }
  } else {
    for (ii = 0; ii < ntodo; ii++) {
      dvalue = ((double)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):
<ffu2fi2>:
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    11a4 <ffu2fi2+0xa4>
jp     11a4 <ffu2fi2+0xa4>
movsd  -0x20(%rbp),%xmm0
movsd  0xec0(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    11a4 <ffu2fi2+0xa4>
jp     11a4 <ffu2fi2+0xa4>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    119f <ffu2fi2+0x9f>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
xor    $0x8000,%eax
mov    %ax,%dx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1160 <ffu2fi2+0x60>
jmp    1397 <ffu2fi2+0x297>
movsd  -0x18(%rbp),%xmm0
movsd  0xe4f(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1265 <ffu2fi2+0x165>
jp     1265 <ffu2fi2+0x165>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1265 <ffu2fi2+0x165>
jp     1265 <ffu2fi2+0x165>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    1260 <ffu2fi2+0x160>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movzwl (%rax,%rcx,2),%eax
mov    0x2dd6(%rip),%rcx
movzwl (%rcx),%ecx
cmp    %ecx,%eax
jle    1232 <ffu2fi2+0x132>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    0x2dba(%rip),%rax
mov    (%rax),%dx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    124a <ffu2fi2+0x14a>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    124f <ffu2fi2+0x14f>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    11e1 <ffu2fi2+0xe1>
jmp    1392 <ffu2fi2+0x292>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    138d <ffu2fi2+0x28d>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movzwl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
subsd  -0x20(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xd6e(%rip),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    12d2 <ffu2fi2+0x1d2>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    0x2d22(%rip),%rax
mov    (%rax),%dx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1377 <ffu2fi2+0x277>
movsd  -0x40(%rbp),%xmm0
movsd  0xd39(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    130e <ffu2fi2+0x20e>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    0x2cde(%rip),%rax
mov    (%rax),%dx
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1372 <ffu2fi2+0x272>
movsd  -0x40(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1349 <ffu2fi2+0x249>
movsd  -0x40(%rbp),%xmm0
movsd  0xcfb(%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    136d <ffu2fi2+0x26d>
movsd  -0x40(%rbp),%xmm0
movsd  0xcca(%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    1372 <ffu2fi2+0x272>
jmp    1377 <ffu2fi2+0x277>
jmp    137c <ffu2fi2+0x27c>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    126d <ffu2fi2+0x16d>
jmp    1392 <ffu2fi2+0x292>
jmp    1397 <ffu2fi2+0x297>
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ffu2fi2>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
ucomisd 0xeee(%rip),%xmm0
jne    11f0 <ffu2fi2+0xf0>
jp     11f0 <ffu2fi2+0xf0>
ucomisd 0xee2(%rip),%xmm1
jne    11f0 <ffu2fi2+0xf0>
jp     11f0 <ffu2fi2+0xf0>
test   %rsi,%rsi
jle    156b <ffu2fi2+0x46b>
cmp    $0x10,%rsi
jb     115b <ffu2fi2+0x5b>
lea    (%rdi,%rsi,2),%rax
cmp    %rdx,%rax
jbe    1376 <ffu2fi2+0x276>
lea    (%rdx,%rsi,2),%rax
cmp    %rdi,%rax
jbe    1376 <ffu2fi2+0x276>
xor    %r11d,%r11d
mov    %r11,%r8
not    %r8
add    %rsi,%r8
mov    %rsi,%rax
and    $0x3,%rax
je     118a <ffu2fi2+0x8a>
movzwl (%rdi,%r11,2),%ebp
xor    $0x8000,%ebp
mov    %bp,(%rdx,%r11,2)
add    $0x1,%r11
add    $0xffffffffffffffff,%rax
jne    1170 <ffu2fi2+0x70>
cmp    $0x3,%r8
jb     156b <ffu2fi2+0x46b>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzwl (%rdi,%r11,2),%eax
xor    $0x8000,%eax
mov    %ax,(%rdx,%r11,2)
movzwl 0x2(%rdi,%r11,2),%eax
xor    $0x8000,%eax
mov    %ax,0x2(%rdx,%r11,2)
movzwl 0x4(%rdi,%r11,2),%eax
xor    $0x8000,%eax
mov    %ax,0x4(%rdx,%r11,2)
movzwl 0x6(%rdi,%r11,2),%eax
xor    $0x8000,%eax
mov    %ax,0x6(%rdx,%r11,2)
add    $0x4,%r11
cmp    %r11,%rsi
jne    11a0 <ffu2fi2+0xa0>
jmp    156b <ffu2fi2+0x46b>
ucomisd 0xe08(%rip),%xmm0
jne    12c5 <ffu2fi2+0x1c5>
jp     12c5 <ffu2fi2+0x1c5>
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm1
jne    12c5 <ffu2fi2+0x1c5>
jp     12c5 <ffu2fi2+0x1c5>
test   %rsi,%rsi
jle    156b <ffu2fi2+0x46b>
cmp    $0x4,%rsi
jae    143e <ffu2fi2+0x33e>
xor    %r8d,%r8d
mov    %r8,%rax
not    %rax
test   $0x1,%sil
je     125f <ffu2fi2+0x15f>
movzwl (%rdi,%r8,2),%ebp
mov    0x2d92(%rip),%rbx
movzwl (%rbx),%ebx
cmp    %bx,%bp
jbe    1256 <ffu2fi2+0x156>
movl   $0xfffffff5,(%rcx)
mov    %ebx,%ebp
mov    %bp,(%rdx,%r8,2)
or     $0x1,%r8
add    %rsi,%rax
je     156b <ffu2fi2+0x46b>
mov    0x2d69(%rip),%rax
jmp    1293 <ffu2fi2+0x193>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %bp,0x2(%rdx,%r8,2)
add    $0x2,%r8
cmp    %r8,%rsi
je     156b <ffu2fi2+0x46b>
movzwl (%rdi,%r8,2),%ebp
movzwl (%rax),%ebx
cmp    %bx,%bp
jbe    12a8 <ffu2fi2+0x1a8>
movl   $0xfffffff5,(%rcx)
mov    %ebx,%ebp
mov    %bp,(%rdx,%r8,2)
movzwl 0x2(%rdi,%r8,2),%ebp
movzwl (%rax),%ebx
cmp    %bx,%bp
jbe    1280 <ffu2fi2+0x180>
movl   $0xfffffff5,(%rcx)
mov    %ebx,%ebp
jmp    1280 <ffu2fi2+0x180>
test   %rsi,%rsi
jle    156b <ffu2fi2+0x46b>
xor    %eax,%eax
movsd  0xd38(%rip),%xmm2
mov    0x2d01(%rip),%r8
movsd  0xd31(%rip),%xmm3
mov    0x2cea(%rip),%r9
xorpd  %xmm4,%xmm4
movsd  0xd2e(%rip),%xmm5
movsd  0xd1e(%rip),%xmm6
jmp    132b <ffu2fi2+0x22b>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movl   $0xfffffff5,(%rcx)
movzwl (%r8),%ebp
mov    %bp,(%rdx,%rax,2)
add    $0x1,%rax
cmp    %rax,%rsi
je     156b <ffu2fi2+0x46b>
movzwl (%rdi,%rax,2),%ebp
xorps  %xmm7,%xmm7
cvtsi2sd %ebp,%xmm7
subsd  %xmm1,%xmm7
divsd  %xmm0,%xmm7
ucomisd %xmm7,%xmm2
ja     1310 <ffu2fi2+0x210>
ucomisd %xmm3,%xmm7
jbe    1360 <ffu2fi2+0x260>
movl   $0xfffffff5,(%rcx)
movzwl (%r9),%ebp
jmp    131a <ffu2fi2+0x21a>
cs nopw 0x0(%rax,%rax,1)
ucomisd %xmm4,%xmm7
jae    136c <ffu2fi2+0x26c>
addsd  %xmm5,%xmm7
jmp    1370 <ffu2fi2+0x270>
addsd  %xmm6,%xmm7
cvttsd2si %xmm7,%ebp
jmp    131a <ffu2fi2+0x21a>
mov    %rsi,%r11
and    $0xfffffffffffffff0,%r11
lea    -0x10(%r11),%rax
mov    %rax,%r9
shr    $0x4,%r9
add    $0x1,%r9
test   %rax,%rax
je     1578 <ffu2fi2+0x478>
mov    %r9,%r10
and    $0xfffffffffffffffe,%r10
xor    %r8d,%r8d
movapd 0xc89(%rip),%xmm0
nopw   0x0(%rax,%rax,1)
movupd (%rdi,%r8,2),%xmm1
movupd 0x10(%rdi,%r8,2),%xmm2
xorpd  %xmm0,%xmm1
xorpd  %xmm0,%xmm2
movupd %xmm1,(%rdx,%r8,2)
movupd %xmm2,0x10(%rdx,%r8,2)
movupd 0x20(%rdi,%r8,2),%xmm1
movupd 0x30(%rdi,%r8,2),%xmm2
xorpd  %xmm0,%xmm1
xorpd  %xmm0,%xmm2
movupd %xmm1,0x20(%rdx,%r8,2)
movupd %xmm2,0x30(%rdx,%r8,2)
add    $0x20,%r8
add    $0xfffffffffffffffe,%r10
jne    13b0 <ffu2fi2+0x2b0>
test   $0x1,%r9b
je     1430 <ffu2fi2+0x330>
movupd (%rdi,%r8,2),%xmm0
movupd 0x10(%rdi,%r8,2),%xmm1
movapd 0xc15(%rip),%xmm2
xorpd  %xmm2,%xmm0
xorpd  %xmm2,%xmm1
movupd %xmm0,(%rdx,%r8,2)
movupd %xmm1,0x10(%rdx,%r8,2)
cmp    %rsi,%r11
je     156b <ffu2fi2+0x46b>
jmp    115e <ffu2fi2+0x5e>
lea    (%rdx,%rsi,2),%rbp
cmp    %rcx,%rbp
seta   -0x19(%rsp)
lea    0x4(%rcx),%rbx
cmp    %rdx,%rbx
seta   %r12b
lea    (%rdi,%rsi,2),%r8
cmp    %rcx,%r8
seta   %r10b
cmp    %rdi,%rbx
seta   %r13b
mov    0x2b6a(%rip),%r15
lea    0x2(%r15),%rax
cmp    %rax,%rcx
setb   %r9b
cmp    %r15,%rbx
seta   %r14b
cmp    %rdx,%r8
seta   %r11b
cmp    %rdi,%rbp
seta   -0x1a(%rsp)
cmp    %rax,%rdx
setb   %bl
cmp    %r15,%rbp
seta   %bpl
xor    %r8d,%r8d
test   %r12b,-0x19(%rsp)
jne    122e <ffu2fi2+0x12e>
and    %r13b,%r10b
jne    122e <ffu2fi2+0x12e>
and    %r14b,%r9b
jne    122e <ffu2fi2+0x12e>
and    -0x1a(%rsp),%r11b
jne    122e <ffu2fi2+0x12e>
and    %bpl,%bl
jne    122e <ffu2fi2+0x12e>
mov    %rsi,%r8
and    $0xfffffffffffffffc,%r8
movzwl (%r15),%eax
movd   %eax,%xmm0
pshuflw $0x0,%xmm0,%xmm0
xor    %eax,%eax
movdqa 0xb42(%rip),%xmm1
movdqa %xmm0,%xmm2
pxor   %xmm1,%xmm2
jmp    1520 <ffu2fi2+0x420>
nopl   0x0(%rax,%rax,1)
movl   $0xfffffff5,(%rcx)
movdqa %xmm3,%xmm4
psubusw %xmm0,%xmm4
psubw  %xmm4,%xmm3
movq   %xmm3,(%rdx,%rax,2)
add    $0x4,%rax
cmp    %rax,%r8
je     1562 <ffu2fi2+0x462>
movq   (%rdi,%rax,2),%xmm3
movdqa %xmm3,%xmm4
pxor   %xmm1,%xmm4
pcmpgtw %xmm2,%xmm4
punpcklwd %xmm4,%xmm4
psrad  $0x10,%xmm4
pshufd $0xd4,%xmm4,%xmm5
psllq  $0x3f,%xmm5
movmskpd %xmm5,%ebp
movdqa %xmm4,-0x18(%rsp)
test   %ebp,%ebp
jne    1500 <ffu2fi2+0x400>
testb  $0x1,-0x10(%rsp)
jne    1500 <ffu2fi2+0x400>
testb  $0x1,-0xc(%rsp)
je     1506 <ffu2fi2+0x406>
jmp    1500 <ffu2fi2+0x400>
cmp    %rsi,%r8
jne    122e <ffu2fi2+0x12e>
mov    (%rcx),%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %r8d,%r8d
test   $0x1,%r9b
jne    1406 <ffu2fi2+0x306>
jmp    1430 <ffu2fi2+0x330>

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

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