#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 char UCHAR_MAX;
int /*<<< orphan*/ memcpy(unsigned char *, unsigned char *, long);
int ffi1fi1(unsigned char *input, long ntodo, double scale, double zero,
            unsigned char *output, int *status) {
  long ii;
  double dvalue;
  if (scale == 1. && zero == 0.) {
    memcpy(output, input, ntodo);
  } else {
    for (ii = 0; ii < ntodo; ii++) {
      dvalue = (((double)input[ii]) - zero) / scale;
      if (dvalue < -0.49) {
        *status = -11;
        output[ii] = 0;
      } else if (dvalue > 255.49) {
        *status = -11;
        output[ii] = UCHAR_MAX;
      } else
        output[ii] = (unsigned char)(dvalue + .5);
    }
  }
  return (*status);
}


x86 assembly (clang, -O0):
<ffi1fi1>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
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  0xec1(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    117d <ffi1fi1+0x6d>
jp     117d <ffi1fi1+0x6d>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    117d <ffi1fi1+0x6d>
jp     117d <ffi1fi1+0x6d>
mov    -0x28(%rbp),%rdi
mov    -0x8(%rbp),%rsi
mov    -0x10(%rbp),%rdx
call   1030 <memcpy@plt>
jmp    125c <ffi1fi1+0x14c>
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    1257 <ffi1fi1+0x147>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2sd %eax,%xmm0
subsd  -0x20(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xe4e(%rip),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    11e0 <ffi1fi1+0xd0>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    1241 <ffi1fi1+0x131>
movsd  -0x40(%rbp),%xmm0
movsd  0xe23(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    121a <ffi1fi1+0x10a>
mov    -0x30(%rbp),%rax
movl   $0xfffffff5,(%rax)
mov    0x2de8(%rip),%rax
mov    (%rax),%dl
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    123c <ffi1fi1+0x12c>
movsd  -0x40(%rbp),%xmm0
movsd  0xdf1(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %al,%dl
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1241 <ffi1fi1+0x131>
jmp    1246 <ffi1fi1+0x136>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1185 <ffi1fi1+0x75>
jmp    125c <ffi1fi1+0x14c>
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ffi1fi1>:
push   %rbx
mov    %rcx,%rbx
mov    %rsi,%rax
mov    %rdi,%rsi
ucomisd 0xede(%rip),%xmm0
jne    113f <ffi1fi1+0x2f>
jp     113f <ffi1fi1+0x2f>
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm1
jne    113f <ffi1fi1+0x2f>
jp     113f <ffi1fi1+0x2f>
mov    %rdx,%rdi
mov    %rax,%rdx
call   1030 <memcpy@plt>
jmp    11ba <ffi1fi1+0xaa>
test   %rax,%rax
jle    11ba <ffi1fi1+0xaa>
xor    %ecx,%ecx
movsd  0xeba(%rip),%xmm2
movsd  0xeba(%rip),%xmm3
mov    0x2e93(%rip),%r8
movsd  0xeb3(%rip),%xmm4
jmp    1185 <ffi1fi1+0x75>
nopw   0x0(%rax,%rax,1)
movl   $0xfffffff5,(%rbx)
xor    %edi,%edi
mov    %dil,(%rdx,%rcx,1)
add    $0x1,%rcx
cmp    %rcx,%rax
je     11ba <ffi1fi1+0xaa>
movzbl (%rsi,%rcx,1),%edi
xorps  %xmm5,%xmm5
cvtsi2sd %edi,%xmm5
subsd  %xmm1,%xmm5
divsd  %xmm0,%xmm5
ucomisd %xmm5,%xmm2
ja     1170 <ffi1fi1+0x60>
ucomisd %xmm3,%xmm5
jbe    11b0 <ffi1fi1+0xa0>
movl   $0xfffffff5,(%rbx)
movzbl (%r8),%edi
jmp    1178 <ffi1fi1+0x68>
addsd  %xmm4,%xmm5
cvttsd2si %xmm5,%edi
jmp    1178 <ffi1fi1+0x68>
mov    (%rbx),%eax
pop    %rbx
ret

LLVM IR (-O0):
@UCHAR_MAX = global i8 0
define i32 @ffi1fi1(i8* %0, i64 %1, double %2, double %3, i8* %4, i32* %5) {
%7 = alloca i8*
%8 = alloca i64
%9 = alloca double
%10 = alloca double
%11 = alloca i8*
%12 = alloca i32*
%13 = alloca i64
%14 = alloca double
store i8* %0, i8** %7
store i64 %1, i64* %8
store double %2, double* %9
store double %3, double* %10
store i8* %4, i8** %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 %25
17: ; preds = %6
%18 = load double, double* %10
%19 = fcmp oeq double %18, 0.000000e+00
br i1 %19, label %20, label %25
20: ; preds = %17
%21 = load i8*, i8** %11
%22 = load i8*, i8** %7
%23 = load i64, i64* %8
%24 = call i32 @memcpy(i8* %21, i8* %22, i64 %23)
br label %69
25: ; preds = %17, %6
store i64 0, i64* %13
br label %26
26: ; preds = %65, %25
%27 = load i64, i64* %13
%28 = load i64, i64* %8
%29 = icmp slt i64 %27, %28
br i1 %29, label %30, label %68
30: ; preds = %26
%31 = load i8*, i8** %7
%32 = load i64, i64* %13
%33 = getelementptr inbounds i8, i8* %31, i64 %32
%34 = load i8, i8* %33
%35 = uitofp i8 %34 to double
%36 = load double, double* %10
%37 = fsub double %35, %36
%38 = load double, double* %9
%39 = fdiv double %37, %38
store double %39, double* %14
%40 = load double, double* %14
%41 = fcmp olt double %40, -4.900000e-01
br i1 %41, label %42, label %47
42: ; preds = %30
%43 = load i32*, i32** %12
store i32 -11, i32* %43
%44 = load i8*, i8** %11
%45 = load i64, i64* %13
%46 = getelementptr inbounds i8, i8* %44, i64 %45
store i8 0, i8* %46
br label %64
47: ; preds = %30
%48 = load double, double* %14
%49 = fcmp ogt double %48, 2.554900e+02
br i1 %49, label %50, label %56
50: ; preds = %47
%51 = load i32*, i32** %12
store i32 -11, i32* %51
%52 = load i8, i8* @UCHAR_MAX
%53 = load i8*, i8** %11
%54 = load i64, i64* %13
%55 = getelementptr inbounds i8, i8* %53, i64 %54
store i8 %52, i8* %55
br label %63
56: ; preds = %47
%57 = load double, double* %14
%58 = fadd double %57, 5.000000e-01
%59 = fptoui double %58 to i8
%60 = load i8*, i8** %11
%61 = load i64, i64* %13
%62 = getelementptr inbounds i8, i8* %60, i64 %61
store i8 %59, i8* %62
br label %63
63: ; preds = %56, %50
br label %64
64: ; preds = %63, %42
br label %65
65: ; preds = %64
%66 = load i64, i64* %13
%67 = add nsw i64 %66, 1
store i64 %67, i64* %13
br label %26
68: ; preds = %26
br label %69
69: ; preds = %68, %20
%70 = load i32*, i32** %12
%71 = load i32, i32* %70
ret i32 %71
}

LLVM IR (-O2):
@UCHAR_MAX = global i8 0
define i32 @ffi1fi1(i8* %0, i64 %1, double %2, double %3, i8* %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
br i1 %9, label %12, label %10
10: ; preds = %6
%11 = icmp sgt i64 %1, 0
br i1 %11, label %14, label %35
12: ; preds = %6
%13 = tail call i32 @memcpy(i8* %4, i8* %0, i64 %1)
br label %35
14: ; preds = %10, %30
%15 = phi i64 [ %33, %30 ], [ 0, %10 ]
%16 = getelementptr inbounds i8, i8* %0, i64 %15
%17 = load i8, i8* %16
%18 = uitofp i8 %17 to double
%19 = fsub double %18, %3
%20 = fdiv double %19, %2
%21 = fcmp olt double %20, -4.900000e-01
br i1 %21, label %22, label %23
22: ; preds = %14
store i32 -11, i32* %5
br label %30
23: ; preds = %14
%24 = fcmp ogt double %20, 2.554900e+02
br i1 %24, label %25, label %27
25: ; preds = %23
store i32 -11, i32* %5
%26 = load i8, i8* @UCHAR_MAX
br label %30
27: ; preds = %23
%28 = fadd double %20, 5.000000e-01
%29 = fptoui double %28 to i8
br label %30
30: ; preds = %22, %27, %25
%31 = phi i8 [ 0, %22 ], [ %29, %27 ], [ %26, %25 ]
%32 = getelementptr inbounds i8, i8* %4, i64 %15
store i8 %31, i8* %32
%33 = add nuw nsw i64 %15, 1
%34 = icmp eq i64 %33, %1
br i1 %34, label %35, label %14
35: ; preds = %30, %10, %12
%36 = load i32, i32* %5
ret i32 %36
}