#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 checksumLN(unsigned char *, int);
int binaryStateLN(unsigned char *packet, int addr, int nr, int val) {
  int longaddr = (addr > 127 ? 1 : 0);
  packet[0] = 0xed;
  packet[1] = 0x0B;
  packet[2] = 0x7F;
  packet[3] = (longaddr ? 0x54 : 0x44);
  packet[4] = 0x20;
  if (longaddr) {
    packet[5] = 0xC0 | (addr >> 8);
    packet[6] = addr & 0xFF;
    packet[7] = 0xC0;
    packet[8] = (nr & 0x7F) + (val ? 0x80 : 0x00);
    packet[9] = (nr >> 7);
  } else {
    packet[5] = addr;
    packet[6] = 0xC0;
    packet[7] = (nr & 0x7F) | (val ? 0x80 : 0x00);
    packet[8] = (nr >> 7);
    packet[9] = 0;
  }
  packet[10] = 0;
  if (packet[5] & 0x80)
    packet[4] |= 0x01;
  if (packet[6] & 0x80)
    packet[4] |= 0x02;
  if (packet[7] & 0x80)
    packet[4] |= 0x04;
  if (packet[8] & 0x80)
    packet[4] |= 0x08;
  if (packet[9] & 0x80)
    packet[4] |= 0x10;
  packet[5] &= 0x7F;
  packet[6] &= 0x7F;
  packet[7] &= 0x7F;
  packet[8] &= 0x7F;
  packet[9] &= 0x7F;
  packet[10] = checksumLN(packet, 10);
  return 11;
}


x86 assembly (clang, -O0):
<binaryStateLN>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    -0xc(%rbp),%edx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x7f,%edx
cmovg  %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movb   $0xed,(%rax)
mov    -0x8(%rbp),%rax
movb   $0xb,0x1(%rax)
mov    -0x8(%rbp),%rax
movb   $0x7f,0x2(%rax)
mov    -0x18(%rbp),%edx
mov    $0x44,%eax
mov    $0x54,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x3(%rax)
mov    -0x8(%rbp),%rax
movb   $0x20,0x4(%rax)
cmpl   $0x0,-0x18(%rbp)
je     11df <binaryStateLN+0xcf>
mov    -0xc(%rbp),%eax
sar    $0x8,%eax
or     $0xc0,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x5(%rax)
mov    -0xc(%rbp),%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x6(%rax)
mov    -0x8(%rbp),%rax
movb   $0xc0,0x7(%rax)
mov    -0x10(%rbp),%eax
and    $0x7f,%eax
mov    -0x14(%rbp),%esi
xor    %ecx,%ecx
mov    $0x80,%edx
cmp    $0x0,%esi
cmovne %edx,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x8(%rax)
mov    -0x10(%rbp),%eax
sar    $0x7,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x9(%rax)
jmp    122b <binaryStateLN+0x11b>
mov    -0xc(%rbp),%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x5(%rax)
mov    -0x8(%rbp),%rax
movb   $0xc0,0x6(%rax)
mov    -0x10(%rbp),%eax
and    $0x7f,%eax
mov    -0x14(%rbp),%esi
xor    %ecx,%ecx
mov    $0x80,%edx
cmp    $0x0,%esi
cmovne %edx,%ecx
or     %ecx,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x7(%rax)
mov    -0x10(%rbp),%eax
sar    $0x7,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x8(%rax)
mov    -0x8(%rbp),%rax
movb   $0x0,0x9(%rax)
mov    -0x8(%rbp),%rax
movb   $0x0,0xa(%rax)
mov    -0x8(%rbp),%rax
movzbl 0x5(%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     1257 <binaryStateLN+0x147>
mov    -0x8(%rbp),%rax
movzbl 0x4(%rax),%ecx
or     $0x1,%ecx
mov    %cl,0x4(%rax)
mov    -0x8(%rbp),%rax
movzbl 0x6(%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     127b <binaryStateLN+0x16b>
mov    -0x8(%rbp),%rax
movzbl 0x4(%rax),%ecx
or     $0x2,%ecx
mov    %cl,0x4(%rax)
mov    -0x8(%rbp),%rax
movzbl 0x7(%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     129f <binaryStateLN+0x18f>
mov    -0x8(%rbp),%rax
movzbl 0x4(%rax),%ecx
or     $0x4,%ecx
mov    %cl,0x4(%rax)
mov    -0x8(%rbp),%rax
movzbl 0x8(%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     12c3 <binaryStateLN+0x1b3>
mov    -0x8(%rbp),%rax
movzbl 0x4(%rax),%ecx
or     $0x8,%ecx
mov    %cl,0x4(%rax)
mov    -0x8(%rbp),%rax
movzbl 0x9(%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     12e7 <binaryStateLN+0x1d7>
mov    -0x8(%rbp),%rax
movzbl 0x4(%rax),%ecx
or     $0x10,%ecx
mov    %cl,0x4(%rax)
mov    -0x8(%rbp),%rax
movzbl 0x5(%rax),%ecx
and    $0x7f,%ecx
mov    %cl,0x5(%rax)
mov    -0x8(%rbp),%rax
movzbl 0x6(%rax),%ecx
and    $0x7f,%ecx
mov    %cl,0x6(%rax)
mov    -0x8(%rbp),%rax
movzbl 0x7(%rax),%ecx
and    $0x7f,%ecx
mov    %cl,0x7(%rax)
mov    -0x8(%rbp),%rax
movzbl 0x8(%rax),%ecx
and    $0x7f,%ecx
mov    %cl,0x8(%rax)
mov    -0x8(%rbp),%rax
movzbl 0x9(%rax),%ecx
and    $0x7f,%ecx
mov    %cl,0x9(%rax)
mov    -0x8(%rbp),%rdi
mov    $0xa,%esi
call   1030 <checksumLN@plt>
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0xa(%rax)
mov    $0xb,%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<binaryStateLN>:
push   %rbx
mov    %rdi,%rbx
cmp    $0x7f,%esi
setg   %al
shl    $0x4,%al
or     $0x44,%al
movw   $0xbed,(%rdi)
movb   $0x7f,0x2(%rdi)
mov    %al,0x3(%rdi)
movb   $0x20,0x4(%rdi)
cmp    $0x80,%esi
jl     115f <binaryStateLN+0x4f>
mov    %esi,%edi
shr    $0x8,%edi
or     $0xc0,%dil
mov    %edx,%r8d
and    $0x7f,%r8d
xor    %r10d,%r10d
test   %ecx,%ecx
setne  %r10b
shl    $0x7,%r10d
or     %r8d,%r10d
shr    $0x7,%edx
mov    $0xc0,%r8b
jmp    1181 <binaryStateLN+0x71>
mov    %edx,%eax
and    $0x7f,%eax
xor    %r8d,%r8d
test   %ecx,%ecx
setne  %r8b
shl    $0x7,%r8d
or     %eax,%r8d
shr    $0x7,%edx
mov    %esi,%edi
mov    $0xc0,%sil
mov    %edx,%r10d
xor    %edx,%edx
mov    %dil,0x5(%rbx)
movb   $0x0,0xa(%rbx)
mov    %esi,%ecx
or     %r8b,%cl
or     %dil,%cl
or     %dl,%cl
js     119a <binaryStateLN+0x8a>
test   %r10b,%r10b
jns    11d5 <binaryStateLN+0xc5>
mov    %edi,%r9d
shr    $0x7,%r9b
mov    %esi,%ecx
shr    $0x6,%cl
and    $0x2,%cl
or     %r9b,%cl
mov    %r8d,%eax
shr    $0x5,%al
and    $0x4,%al
or     %cl,%al
mov    %r10d,%ecx
shr    $0x4,%cl
and    $0x8,%cl
or     %al,%cl
or     $0x20,%cl
movzbl %cl,%eax
or     $0x10,%cl
test   %dl,%dl
movzbl %cl,%ecx
cmovns %eax,%ecx
mov    %cl,0x4(%rbx)
and    $0x7f,%dil
mov    %dil,0x5(%rbx)
and    $0x7f,%sil
mov    %sil,0x6(%rbx)
and    $0x7f,%r8b
mov    %r8b,0x7(%rbx)
and    $0x7f,%r10b
mov    %r10b,0x8(%rbx)
and    $0x7f,%dl
mov    %dl,0x9(%rbx)
mov    %rbx,%rdi
mov    $0xa,%esi
call   1030 <checksumLN@plt>
mov    %al,0xa(%rbx)
mov    $0xb,%eax
pop    %rbx
ret

LLVM IR (-O0):
define i32 @binaryStateLN(i8* %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i8* %0, i8** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i32 %3, i32* %8
%10 = load i32, i32* %6
%11 = icmp sgt i32 %10, 127
%12 = zext i1 %11 to i64
%13 = select i1 %11, i32 1, i32 0
store i32 %13, i32* %9
%14 = load i8*, i8** %5
%15 = getelementptr inbounds i8, i8* %14, i64 0
store i8 -19, i8* %15
%16 = load i8*, i8** %5
%17 = getelementptr inbounds i8, i8* %16, i64 1
store i8 11, i8* %17
%18 = load i8*, i8** %5
%19 = getelementptr inbounds i8, i8* %18, i64 2
store i8 127, i8* %19
%20 = load i32, i32* %9
%21 = icmp ne i32 %20, 0
%22 = zext i1 %21 to i64
%23 = select i1 %21, i32 84, i32 68
%24 = trunc i32 %23 to i8
%25 = load i8*, i8** %5
%26 = getelementptr inbounds i8, i8* %25, i64 3
store i8 %24, i8* %26
%27 = load i8*, i8** %5
%28 = getelementptr inbounds i8, i8* %27, i64 4
store i8 32, i8* %28
%29 = load i32, i32* %9
%30 = icmp ne i32 %29, 0
br i1 %30, label %31, label %60
31: ; preds = %4
%32 = load i32, i32* %6
%33 = ashr i32 %32, 8
%34 = or i32 192, %33
%35 = trunc i32 %34 to i8
%36 = load i8*, i8** %5
%37 = getelementptr inbounds i8, i8* %36, i64 5
store i8 %35, i8* %37
%38 = load i32, i32* %6
%39 = and i32 %38, 255
%40 = trunc i32 %39 to i8
%41 = load i8*, i8** %5
%42 = getelementptr inbounds i8, i8* %41, i64 6
store i8 %40, i8* %42
%43 = load i8*, i8** %5
%44 = getelementptr inbounds i8, i8* %43, i64 7
store i8 -64, i8* %44
%45 = load i32, i32* %7
%46 = and i32 %45, 127
%47 = load i32, i32* %8
%48 = icmp ne i32 %47, 0
%49 = zext i1 %48 to i64
%50 = select i1 %48, i32 128, i32 0
%51 = add nsw i32 %46, %50
%52 = trunc i32 %51 to i8
%53 = load i8*, i8** %5
%54 = getelementptr inbounds i8, i8* %53, i64 8
store i8 %52, i8* %54
%55 = load i32, i32* %7
%56 = ashr i32 %55, 7
%57 = trunc i32 %56 to i8
%58 = load i8*, i8** %5
%59 = getelementptr inbounds i8, i8* %58, i64 9
store i8 %57, i8* %59
br label %84
60: ; preds = %4
%61 = load i32, i32* %6
%62 = trunc i32 %61 to i8
%63 = load i8*, i8** %5
%64 = getelementptr inbounds i8, i8* %63, i64 5
store i8 %62, i8* %64
%65 = load i8*, i8** %5
%66 = getelementptr inbounds i8, i8* %65, i64 6
store i8 -64, i8* %66
%67 = load i32, i32* %7
%68 = and i32 %67, 127
%69 = load i32, i32* %8
%70 = icmp ne i32 %69, 0
%71 = zext i1 %70 to i64
%72 = select i1 %70, i32 128, i32 0
%73 = or i32 %68, %72
%74 = trunc i32 %73 to i8
%75 = load i8*, i8** %5
%76 = getelementptr inbounds i8, i8* %75, i64 7
store i8 %74, i8* %76
%77 = load i32, i32* %7
%78 = ashr i32 %77, 7
%79 = trunc i32 %78 to i8
%80 = load i8*, i8** %5
%81 = getelementptr inbounds i8, i8* %80, i64 8
store i8 %79, i8* %81
%82 = load i8*, i8** %5
%83 = getelementptr inbounds i8, i8* %82, i64 9
store i8 0, i8* %83
br label %84
84: ; preds = %60, %31
%85 = load i8*, i8** %5
%86 = getelementptr inbounds i8, i8* %85, i64 10
store i8 0, i8* %86
%87 = load i8*, i8** %5
%88 = getelementptr inbounds i8, i8* %87, i64 5
%89 = load i8, i8* %88
%90 = zext i8 %89 to i32
%91 = and i32 %90, 128
%92 = icmp ne i32 %91, 0
br i1 %92, label %93, label %100
93: ; preds = %84
%94 = load i8*, i8** %5
%95 = getelementptr inbounds i8, i8* %94, i64 4
%96 = load i8, i8* %95
%97 = zext i8 %96 to i32
%98 = or i32 %97, 1
%99 = trunc i32 %98 to i8
store i8 %99, i8* %95
br label %100
100: ; preds = %93, %84
%101 = load i8*, i8** %5
%102 = getelementptr inbounds i8, i8* %101, i64 6
%103 = load i8, i8* %102
%104 = zext i8 %103 to i32
%105 = and i32 %104, 128
%106 = icmp ne i32 %105, 0
br i1 %106, label %107, label %114
107: ; preds = %100
%108 = load i8*, i8** %5
%109 = getelementptr inbounds i8, i8* %108, i64 4
%110 = load i8, i8* %109
%111 = zext i8 %110 to i32
%112 = or i32 %111, 2
%113 = trunc i32 %112 to i8
store i8 %113, i8* %109
br label %114
114: ; preds = %107, %100
%115 = load i8*, i8** %5
%116 = getelementptr inbounds i8, i8* %115, i64 7
%117 = load i8, i8* %116
%118 = zext i8 %117 to i32
%119 = and i32 %118, 128
%120 = icmp ne i32 %119, 0
br i1 %120, label %121, label %128
121: ; preds = %114
%122 = load i8*, i8** %5
%123 = getelementptr inbounds i8, i8* %122, i64 4
%124 = load i8, i8* %123
%125 = zext i8 %124 to i32
%126 = or i32 %125, 4
%127 = trunc i32 %126 to i8
store i8 %127, i8* %123
br label %128
128: ; preds = %121, %114
%129 = load i8*, i8** %5
%130 = getelementptr inbounds i8, i8* %129, i64 8
%131 = load i8, i8* %130
%132 = zext i8 %131 to i32
%133 = and i32 %132, 128
%134 = icmp ne i32 %133, 0
br i1 %134, label %135, label %142
135: ; preds = %128
%136 = load i8*, i8** %5
%137 = getelementptr inbounds i8, i8* %136, i64 4
%138 = load i8, i8* %137
%139 = zext i8 %138 to i32
%140 = or i32 %139, 8
%141 = trunc i32 %140 to i8
store i8 %141, i8* %137
br label %142
142: ; preds = %135, %128
%143 = load i8*, i8** %5
%144 = getelementptr inbounds i8, i8* %143, i64 9
%145 = load i8, i8* %144
%146 = zext i8 %145 to i32
%147 = and i32 %146, 128
%148 = icmp ne i32 %147, 0
br i1 %148, label %149, label %156
149: ; preds = %142
%150 = load i8*, i8** %5
%151 = getelementptr inbounds i8, i8* %150, i64 4
%152 = load i8, i8* %151
%153 = zext i8 %152 to i32
%154 = or i32 %153, 16
%155 = trunc i32 %154 to i8
store i8 %155, i8* %151
br label %156
156: ; preds = %149, %142
%157 = load i8*, i8** %5
%158 = getelementptr inbounds i8, i8* %157, i64 5
%159 = load i8, i8* %158
%160 = zext i8 %159 to i32
%161 = and i32 %160, 127
%162 = trunc i32 %161 to i8
store i8 %162, i8* %158
%163 = load i8*, i8** %5
%164 = getelementptr inbounds i8, i8* %163, i64 6
%165 = load i8, i8* %164
%166 = zext i8 %165 to i32
%167 = and i32 %166, 127
%168 = trunc i32 %167 to i8
store i8 %168, i8* %164
%169 = load i8*, i8** %5
%170 = getelementptr inbounds i8, i8* %169, i64 7
%171 = load i8, i8* %170
%172 = zext i8 %171 to i32
%173 = and i32 %172, 127
%174 = trunc i32 %173 to i8
store i8 %174, i8* %170
%175 = load i8*, i8** %5
%176 = getelementptr inbounds i8, i8* %175, i64 8
%177 = load i8, i8* %176
%178 = zext i8 %177 to i32
%179 = and i32 %178, 127
%180 = trunc i32 %179 to i8
store i8 %180, i8* %176
%181 = load i8*, i8** %5
%182 = getelementptr inbounds i8, i8* %181, i64 9
%183 = load i8, i8* %182
%184 = zext i8 %183 to i32
%185 = and i32 %184, 127
%186 = trunc i32 %185 to i8
store i8 %186, i8* %182
%187 = load i8*, i8** %5
%188 = call zeroext i8 @checksumLN(i8* %187, i32 10)
%189 = load i8*, i8** %5
%190 = getelementptr inbounds i8, i8* %189, i64 10
store i8 %188, i8* %190
ret i32 11
}

LLVM IR (-O2):
define i32 @binaryStateLN(i8* %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp sgt i32 %1, 127
store i8 -19, i8* %0
%6 = getelementptr inbounds i8, i8* %0, i64 1
store i8 11, i8* %6
%7 = getelementptr inbounds i8, i8* %0, i64 2
store i8 127, i8* %7
%8 = select i1 %5, i8 84, i8 68
%9 = getelementptr inbounds i8, i8* %0, i64 3
store i8 %8, i8* %9
%10 = getelementptr inbounds i8, i8* %0, i64 4
store i8 32, i8* %10
br i1 %5, label %11, label %22
11: ; preds = %4
%12 = lshr i32 %1, 8
%13 = trunc i32 %12 to i8
%14 = or i8 %13, -64
%15 = trunc i32 %1 to i8
%16 = and i32 %2, 127
%17 = icmp eq i32 %3, 0
%18 = select i1 %17, i32 0, i32 128
%19 = or i32 %18, %16
%20 = lshr i32 %2, 7
%21 = trunc i32 %20 to i8
br label %30
22: ; preds = %4
%23 = trunc i32 %1 to i8
%24 = and i32 %2, 127
%25 = icmp eq i32 %3, 0
%26 = select i1 %25, i32 0, i32 128
%27 = or i32 %26, %24
%28 = trunc i32 %27 to i8
%29 = lshr i32 %2, 7
br label %30
30: ; preds = %22, %11
%31 = phi i8 [ %14, %11 ], [ %23, %22 ]
%32 = phi i8 [ %15, %11 ], [ -64, %22 ]
%33 = phi i8 [ -64, %11 ], [ %28, %22 ]
%34 = phi i32 [ %19, %11 ], [ %29, %22 ]
%35 = phi i8 [ %21, %11 ], [ 0, %22 ]
%36 = trunc i32 %34 to i8
%37 = getelementptr inbounds i8, i8* %0, i64 5
store i8 %31, i8* %37
%38 = getelementptr inbounds i8, i8* %0, i64 10
store i8 0, i8* %38
%39 = icmp sgt i8 %31, -1
%40 = select i1 %39, i8 32, i8 33
%41 = icmp sgt i8 %32, -1
%42 = or i8 %40, 2
%43 = select i1 %41, i8 %40, i8 %42
%44 = or i8 %31, %32
%45 = icmp sgt i8 %33, -1
%46 = or i8 %43, 4
%47 = select i1 %45, i8 %43, i8 %46
%48 = or i8 %33, %44
%49 = icmp sgt i8 %36, -1
%50 = or i8 %47, 8
%51 = select i1 %49, i8 %47, i8 %50
%52 = or i8 %48, %35
%53 = icmp sgt i8 %52, -1
%54 = and i1 %53, %49
br i1 %54, label %59, label %55
55: ; preds = %30
%56 = icmp sgt i8 %35, -1
%57 = or i8 %51, 16
%58 = select i1 %56, i8 %51, i8 %57
store i8 %58, i8* %10
br label %59
59: ; preds = %30, %55
%60 = getelementptr inbounds i8, i8* %0, i64 9
%61 = getelementptr inbounds i8, i8* %0, i64 8
%62 = getelementptr inbounds i8, i8* %0, i64 7
%63 = getelementptr inbounds i8, i8* %0, i64 6
%64 = and i8 %31, 127
store i8 %64, i8* %37
%65 = and i8 %32, 127
store i8 %65, i8* %63
%66 = and i8 %33, 127
store i8 %66, i8* %62
%67 = and i8 %36, 127
store i8 %67, i8* %61
%68 = and i8 %35, 127
store i8 %68, i8* %60
%69 = tail call zeroext i8 @checksumLN(i8* %0, i32 10)
store i8 %69, i8* %38
ret i32 11
}