#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 */
typedef scalar_t__ int8_t;
typedef scalar_t__ int16_t;

/* Variables and functions */
void filter_binary_3s16(int8_t *img_bin, const int16_t *img_in,
                        const int height, const int width,
                        const int16_t threshold, const int8_t bin_value,
                        const int skip_ch1, const int skip_ch2,
                        const int skip_ch3) {
  int y, x, index;
  index = 0;
  for (y = 0; y < height; y++) {
    for (x = 0; x < width; x++) {
      if (!skip_ch1) {
        if (img_in[index] >= threshold) {
          img_bin[index] = bin_value;
        } else {
          img_bin[index] = 0;
        }
      } else {
        img_bin[index] = 0;
      }
      index++;
      if (!skip_ch2) {
        if (img_in[index] >= threshold) {
          img_bin[index] = bin_value;
        } else {
          img_bin[index] = 0;
        }
      } else {
        img_bin[index] = 0;
      }
      index++;
      if (!skip_ch3) {
        if (img_in[index] >= threshold) {
          img_bin[index] = bin_value;
        } else {
          img_bin[index] = 0;
        }
      } else {
        img_bin[index] = 0;
      }
      index++;
    }
  }
}


x86 assembly (clang, -O0):
<filter_binary_3s16>:
push   %rbp
mov    %rsp,%rbp
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    129a <filter_binary_3s16+0x19a>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1287 <filter_binary_3s16+0x187>
cmpl   $0x0,0x10(%rbp)
jne    119a <filter_binary_3s16+0x9a>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cmp    -0x20(%rbp),%rax
jl     1185 <filter_binary_3s16+0x85>
mov    -0x28(%rbp),%rdx
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
jmp    1195 <filter_binary_3s16+0x95>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
jmp    11aa <filter_binary_3s16+0xaa>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,0x18(%rbp)
jne    11fd <filter_binary_3s16+0xfd>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cmp    -0x20(%rbp),%rax
jl     11e8 <filter_binary_3s16+0xe8>
mov    -0x28(%rbp),%rdx
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
jmp    11f8 <filter_binary_3s16+0xf8>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
jmp    120d <filter_binary_3s16+0x10d>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,0x20(%rbp)
jne    1260 <filter_binary_3s16+0x160>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cmp    -0x20(%rbp),%rax
jl     124b <filter_binary_3s16+0x14b>
mov    -0x28(%rbp),%rdx
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
jmp    125b <filter_binary_3s16+0x15b>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
jmp    1270 <filter_binary_3s16+0x170>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1144 <filter_binary_3s16+0x44>
jmp    128c <filter_binary_3s16+0x18c>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1131 <filter_binary_3s16+0x31>
pop    %rbp
ret

x86 assembly (clang, -O2):
<filter_binary_3s16>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %edx,%edx
jle    11db <filter_binary_3s16+0xdb>
mov    0x48(%rsp),%r10d
mov    0x40(%rsp),%r11d
mov    0x38(%rsp),%r12d
add    $0x10,%rdi
add    $0x10,%rsi
xor    %r14d,%r14d
xor    %r15d,%r15d
jmp    1150 <filter_binary_3s16+0x50>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    %ebp,%r14d
add    $0x1,%r15d
cmp    %edx,%r15d
je     11db <filter_binary_3s16+0xdb>
test   %ecx,%ecx
jle    1143 <filter_binary_3s16+0x43>
movslq %r14d,%rax
lea    (%rdi,%rax,8),%rbx
lea    (%rsi,%rax,8),%r13
mov    %ecx,%eax
xor    %ebp,%ebp
jmp    1181 <filter_binary_3s16+0x81>
cs nopw 0x0(%rax,%rax,1)
nop
movq   $0x0,(%rbx,%rbp,8)
add    $0x3,%rbp
add    $0xffffffff,%eax
je     1140 <filter_binary_3s16+0x40>
test   %r12d,%r12d
jne    118d <filter_binary_3s16+0x8d>
cmp    %r8,-0x10(%r13,%rbp,8)
jge    11ae <filter_binary_3s16+0xae>
movq   $0x0,-0x10(%rbx,%rbp,8)
test   %r11d,%r11d
jne    11c0 <filter_binary_3s16+0xc0>
cmp    %r8,-0x8(%r13,%rbp,8)
jl     11c0 <filter_binary_3s16+0xc0>
mov    %r9,-0x8(%rbx,%rbp,8)
test   %r10d,%r10d
jne    1170 <filter_binary_3s16+0x70>
jmp    11ce <filter_binary_3s16+0xce>
mov    %r9,-0x10(%rbx,%rbp,8)
test   %r11d,%r11d
je     119b <filter_binary_3s16+0x9b>
nopl   0x0(%rax,%rax,1)
movq   $0x0,-0x8(%rbx,%rbp,8)
test   %r10d,%r10d
jne    1170 <filter_binary_3s16+0x70>
cmp    %r8,0x0(%r13,%rbp,8)
jl     1170 <filter_binary_3s16+0x70>
mov    %r9,(%rbx,%rbp,8)
jmp    1178 <filter_binary_3s16+0x78>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @filter_binary_3s16(i64* nocapture writeonly %0, i64* nocapture %1, i32 %2, i32 %3, i64 %4, i64 %5, i32 %6, i32 %7, i32 %8) {
%10 = icmp sgt i32 %2, 0
br i1 %10, label %11, label %65
11: ; preds = %9
%12 = icmp sgt i32 %3, 0
%13 = icmp eq i32 %6, 0
%14 = icmp eq i32 %7, 0
%15 = icmp eq i32 %8, 0
br label %16
16: ; preds = %11, %61
%17 = phi i32 [ 0, %11 ], [ %62, %61 ]
%18 = phi i32 [ 0, %11 ], [ %63, %61 ]
br i1 %12, label %19, label %61
19: ; preds = %16
%20 = sext i32 %17 to i64
br label %21
21: ; preds = %19, %55
%22 = phi i64 [ %20, %19 ], [ %56, %55 ]
%23 = phi i32 [ 0, %19 ], [ %57, %55 ]
br i1 %13, label %24, label %31
24: ; preds = %21
%25 = getelementptr inbounds i64, i64* %1, i64 %22
%26 = load i64, i64* %25
%27 = icmp slt i64 %26, %4
%28 = getelementptr inbounds i64, i64* %0, i64 %22
br i1 %27, label %30, label %29
29: ; preds = %24
store i64 %5, i64* %28
br label %33
30: ; preds = %24
store i64 0, i64* %28
br label %33
31: ; preds = %21
%32 = getelementptr inbounds i64, i64* %0, i64 %22
store i64 0, i64* %32
br label %33
33: ; preds = %29, %30, %31
%34 = add nsw i64 %22, 1
br i1 %14, label %35, label %42
35: ; preds = %33
%36 = getelementptr inbounds i64, i64* %1, i64 %34
%37 = load i64, i64* %36
%38 = icmp slt i64 %37, %4
%39 = getelementptr inbounds i64, i64* %0, i64 %34
br i1 %38, label %41, label %40
40: ; preds = %35
store i64 %5, i64* %39
br label %44
41: ; preds = %35
store i64 0, i64* %39
br label %44
42: ; preds = %33
%43 = getelementptr inbounds i64, i64* %0, i64 %34
store i64 0, i64* %43
br label %44
44: ; preds = %40, %41, %42
%45 = add nsw i64 %22, 2
br i1 %15, label %46, label %53
46: ; preds = %44
%47 = getelementptr inbounds i64, i64* %1, i64 %45
%48 = load i64, i64* %47
%49 = icmp slt i64 %48, %4
%50 = getelementptr inbounds i64, i64* %0, i64 %45
br i1 %49, label %52, label %51
51: ; preds = %46
store i64 %5, i64* %50
br label %55
52: ; preds = %46
store i64 0, i64* %50
br label %55
53: ; preds = %44
%54 = getelementptr inbounds i64, i64* %0, i64 %45
store i64 0, i64* %54
br label %55
55: ; preds = %51, %52, %53
%56 = add nsw i64 %22, 3
%57 = add nuw nsw i32 %23, 1
%58 = icmp eq i32 %57, %3
br i1 %58, label %59, label %21
59: ; preds = %55
%60 = trunc i64 %56 to i32
br label %61
61: ; preds = %59, %16
%62 = phi i32 [ %17, %16 ], [ %60, %59 ]
%63 = add nuw nsw i32 %18, 1
%64 = icmp eq i32 %63, %2
br i1 %64, label %65, label %16
65: ; preds = %61, %9
ret void
}