#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 int uint8_t;
typedef int uint16_t;

/* Variables and functions */
uint16_t crc_16(uint16_t crc, void *void_buf, size_t size) {
  static const uint16_t crc16_table[256] = {
      0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601,
      0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0,
      0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81,
      0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 0xD801, 0x18C0, 0x1980, 0xD941,
      0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01,
      0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0,
      0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081,
      0x1040, 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
      0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 0x3C00,
      0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0,
      0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981,
      0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41,
      0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700,
      0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0,
      0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281,
      0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
      0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01,
      0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1,
      0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80,
      0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 0xB401, 0x74C0, 0x7580, 0xB541,
      0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101,
      0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0,
      0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481,
      0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
      0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 0x8801,
      0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1,
      0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4400, 0x84C1, 0x8581,
      0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341,
      0x4100, 0x81C1, 0x8081, 0x4040};
  uint8_t *buf, data;
  for (buf = void_buf; size; size--) {
    data = *buf++;
    crc = (crc >> 8) ^ crc16_table[(crc ^ data) & 0xff];
  }
  return crc;
}


x86 assembly (clang, -O0):
<crc_16>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     1169 <crc_16+0x69>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%eax
mov    %eax,-0x24(%rbp)
mov    -0x4(%rbp),%eax
sar    $0x8,%eax
mov    -0x4(%rbp),%ecx
xor    -0x24(%rbp),%ecx
and    $0xff,%ecx
movslq %ecx,%rdx
lea    0xeae(%rip),%rcx
xor    (%rcx,%rdx,4),%eax
mov    %eax,-0x4(%rbp)
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    1117 <crc_16+0x17>
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<crc_16>:
test   %rdx,%rdx
je     1115 <crc_16+0x15>
test   $0x1,%dl
jne    1118 <crc_16+0x18>
mov    %rdx,%r8
cmp    $0x1,%rdx
jne    113d <crc_16+0x3d>
jmp    1177 <crc_16+0x77>
mov    %edi,%eax
ret
mov    %edi,%eax
sar    $0x8,%eax
xor    (%rsi),%edi
add    $0x4,%rsi
movzbl %dil,%ecx
lea    0xed2(%rip),%rdi
xor    (%rdi,%rcx,4),%eax
lea    -0x1(%rdx),%r8
mov    %eax,%edi
cmp    $0x1,%rdx
je     1177 <crc_16+0x77>
xor    %edx,%edx
lea    0xeba(%rip),%rcx
mov    %edi,%eax
nopl   0x0(%rax,%rax,1)
mov    %eax,%edi
xor    (%rsi,%rdx,4),%eax
sar    $0x8,%edi
movzbl %al,%eax
xor    (%rcx,%rax,4),%edi
mov    %edi,%eax
sar    $0x8,%eax
xor    0x4(%rsi,%rdx,4),%edi
movzbl %dil,%edi
xor    (%rcx,%rdi,4),%eax
add    $0x2,%rdx
cmp    %rdx,%r8
jne    1150 <crc_16+0x50>
ret

LLVM IR (-O0):
@crc_16.crc16_table = internal constant [256 x i32] [i32 0, i32 49345, i32 49537, i32 320, i32 49921, i32 960, i32 640, i32 49729, i32 50689, i32 1728, i32 1920, i32 51009, i32 1280, i32 50625, i32 50305, i32 1088, i32 52225, i32 3264, i32 3456, i32 52545, i32 3840, i32 53185, i32 52865, i32 3648, i32 2560, i32 51905, i32 52097, i32 2880, i32 51457, i32 2496, i32 2176, i32 51265, i32 55297, i32 6336, i32 6528, i32 55617, i32 6912, i32 56257, i32 55937, i32 6720, i32 7680, i32 57025, i32 57217, i32 8000, i32 56577, i32 7616, i32 7296, i32 56385, i32 5120, i32 54465, i32 54657, i32 5440, i32 55041, i32 6080, i32 5760, i32 54849, i32 53761, i32 4800, i32 4992, i32 54081, i32 4352, i32 53697, i32 53377, i32 4160, i32 61441, i32 12480, i32 12672, i32 61761, i32 13056, i32 62401, i32 62081, i32 12864, i32 13824, i32 63169, i32 63361, i32 14144, i32 62721, i32 13760, i32 13440, i32 62529, i32 15360, i32 64705, i32 64897, i32 15680, i32 65281, i32 16320, i32 16000, i32 65089, i32 64001, i32 15040, i32 15232, i32 64321, i32 14592, i32 63937, i32 63617, i32 14400, i32 10240, i32 59585, i32 59777, i32 10560, i32 60161, i32 11200, i32 10880, i32 59969, i32 60929, i32 11968, i32 12160, i32 61249, i32 11520, i32 60865, i32 60545, i32 11328, i32 58369, i32 9408, i32 9600, i32 58689, i32 9984, i32 59329, i32 59009, i32 9792, i32 8704, i32 58049, i32 58241, i32 9024, i32 57601, i32 8640, i32 8320, i32 57409, i32 40961, i32 24768, i32 24960, i32 41281, i32 25344, i32 41921, i32 41601, i32 25152, i32 26112, i32 42689, i32 42881, i32 26432, i32 42241, i32 26048, i32 25728, i32 42049, i32 27648, i32 44225, i32 44417, i32 27968, i32 44801, i32 28608, i32 28288, i32 44609, i32 43521, i32 27328, i32 27520, i32 43841, i32 26880, i32 43457, i32 43137, i32 26688, i32 30720, i32 47297, i32 47489, i32 31040, i32 47873, i32 31680, i32 31360, i32 47681, i32 48641, i32 32448, i32 32640, i32 48961, i32 32000, i32 48577, i32 48257, i32 31808, i32 46081, i32 29888, i32 30080, i32 46401, i32 30464, i32 47041, i32 46721, i32 30272, i32 29184, i32 45761, i32 45953, i32 29504, i32 45313, i32 29120, i32 28800, i32 45121, i32 20480, i32 37057, i32 37249, i32 20800, i32 37633, i32 21440, i32 21120, i32 37441, i32 38401, i32 22208, i32 22400, i32 38721, i32 21760, i32 38337, i32 38017, i32 21568, i32 39937, i32 23744, i32 23936, i32 40257, i32 24320, i32 40897, i32 40577, i32 24128, i32 23040, i32 39617, i32 39809, i32 23360, i32 39169, i32 22976, i32 22656, i32 38977, i32 34817, i32 18624, i32 18816, i32 35137, i32 19200, i32 35777, i32 35457, i32 19008, i32 19968, i32 36545, i32 36737, i32 20288, i32 36097, i32 19904, i32 19584, i32 35905, i32 17408, i32 33985, i32 34177, i32 17728, i32 34561, i32 18368, i32 18048, i32 34369, i32 33281, i32 17088, i32 17280, i32 33601, i32 16640, i32 33217, i32 32897, i32 16448]
define i32 @crc_16(i32 %0, i8* %1, i64 %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i64
%7 = alloca i32*
%8 = alloca i32
store i32 %0, i32* %4
store i8* %1, i8** %5
store i64 %2, i64* %6
%9 = load i8*, i8** %5
%10 = bitcast i8* %9 to i32*
store i32* %10, i32** %7
br label %11
11: ; preds = %28, %3
%12 = load i64, i64* %6
%13 = icmp ne i64 %12, 0
br i1 %13, label %14, label %31
14: ; preds = %11
%15 = load i32*, i32** %7
%16 = getelementptr inbounds i32, i32* %15, i32 1
store i32* %16, i32** %7
%17 = load i32, i32* %15
store i32 %17, i32* %8
%18 = load i32, i32* %4
%19 = ashr i32 %18, 8
%20 = load i32, i32* %4
%21 = load i32, i32* %8
%22 = xor i32 %20, %21
%23 = and i32 %22, 255
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds [256 x i32], [256 x i32]* @crc_16.crc16_table, i64 0, i64 %24
%26 = load i32, i32* %25
%27 = xor i32 %19, %26
store i32 %27, i32* %4
br label %28
28: ; preds = %14
%29 = load i64, i64* %6
%30 = add i64 %29, -1
store i64 %30, i64* %6
br label %11
31: ; preds = %11
%32 = load i32, i32* %4
ret i32 %32
}

LLVM IR (-O2):
@crc_16.crc16_table = internal unnamed_addr constant [256 x i32] [i32 0, i32 49345, i32 49537, i32 320, i32 49921, i32 960, i32 640, i32 49729, i32 50689, i32 1728, i32 1920, i32 51009, i32 1280, i32 50625, i32 50305, i32 1088, i32 52225, i32 3264, i32 3456, i32 52545, i32 3840, i32 53185, i32 52865, i32 3648, i32 2560, i32 51905, i32 52097, i32 2880, i32 51457, i32 2496, i32 2176, i32 51265, i32 55297, i32 6336, i32 6528, i32 55617, i32 6912, i32 56257, i32 55937, i32 6720, i32 7680, i32 57025, i32 57217, i32 8000, i32 56577, i32 7616, i32 7296, i32 56385, i32 5120, i32 54465, i32 54657, i32 5440, i32 55041, i32 6080, i32 5760, i32 54849, i32 53761, i32 4800, i32 4992, i32 54081, i32 4352, i32 53697, i32 53377, i32 4160, i32 61441, i32 12480, i32 12672, i32 61761, i32 13056, i32 62401, i32 62081, i32 12864, i32 13824, i32 63169, i32 63361, i32 14144, i32 62721, i32 13760, i32 13440, i32 62529, i32 15360, i32 64705, i32 64897, i32 15680, i32 65281, i32 16320, i32 16000, i32 65089, i32 64001, i32 15040, i32 15232, i32 64321, i32 14592, i32 63937, i32 63617, i32 14400, i32 10240, i32 59585, i32 59777, i32 10560, i32 60161, i32 11200, i32 10880, i32 59969, i32 60929, i32 11968, i32 12160, i32 61249, i32 11520, i32 60865, i32 60545, i32 11328, i32 58369, i32 9408, i32 9600, i32 58689, i32 9984, i32 59329, i32 59009, i32 9792, i32 8704, i32 58049, i32 58241, i32 9024, i32 57601, i32 8640, i32 8320, i32 57409, i32 40961, i32 24768, i32 24960, i32 41281, i32 25344, i32 41921, i32 41601, i32 25152, i32 26112, i32 42689, i32 42881, i32 26432, i32 42241, i32 26048, i32 25728, i32 42049, i32 27648, i32 44225, i32 44417, i32 27968, i32 44801, i32 28608, i32 28288, i32 44609, i32 43521, i32 27328, i32 27520, i32 43841, i32 26880, i32 43457, i32 43137, i32 26688, i32 30720, i32 47297, i32 47489, i32 31040, i32 47873, i32 31680, i32 31360, i32 47681, i32 48641, i32 32448, i32 32640, i32 48961, i32 32000, i32 48577, i32 48257, i32 31808, i32 46081, i32 29888, i32 30080, i32 46401, i32 30464, i32 47041, i32 46721, i32 30272, i32 29184, i32 45761, i32 45953, i32 29504, i32 45313, i32 29120, i32 28800, i32 45121, i32 20480, i32 37057, i32 37249, i32 20800, i32 37633, i32 21440, i32 21120, i32 37441, i32 38401, i32 22208, i32 22400, i32 38721, i32 21760, i32 38337, i32 38017, i32 21568, i32 39937, i32 23744, i32 23936, i32 40257, i32 24320, i32 40897, i32 40577, i32 24128, i32 23040, i32 39617, i32 39809, i32 23360, i32 39169, i32 22976, i32 22656, i32 38977, i32 34817, i32 18624, i32 18816, i32 35137, i32 19200, i32 35777, i32 35457, i32 19008, i32 19968, i32 36545, i32 36737, i32 20288, i32 36097, i32 19904, i32 19584, i32 35905, i32 17408, i32 33985, i32 34177, i32 17728, i32 34561, i32 18368, i32 18048, i32 34369, i32 33281, i32 17088, i32 17280, i32 33601, i32 16640, i32 33217, i32 32897, i32 16448]
define i32 @crc_16(i32 %0, i8* nocapture %1, i64 %2) {
%4 = icmp eq i64 %2, 0
br i1 %4, label %51, label %5
5: ; preds = %3
%6 = bitcast i8* %1 to i32*
%7 = and i64 %2, 1
%8 = icmp eq i64 %7, 0
br i1 %8, label %21, label %9
9: ; preds = %5
%10 = getelementptr inbounds i8, i8* %1, i64 4
%11 = bitcast i8* %10 to i32*
%12 = load i32, i32* %6
%13 = ashr i32 %0, 8
%14 = xor i32 %12, %0
%15 = and i32 %14, 255
%16 = zext i32 %15 to i64
%17 = getelementptr inbounds [256 x i32], [256 x i32]* @crc_16.crc16_table, i64 0, i64 %16
%18 = load i32, i32* %17
%19 = xor i32 %18, %13
%20 = add i64 %2, -1
br label %21
21: ; preds = %9, %5
%22 = phi i32 [ undef, %5 ], [ %19, %9 ]
%23 = phi i32 [ %0, %5 ], [ %19, %9 ]
%24 = phi i32* [ %6, %5 ], [ %11, %9 ]
%25 = phi i64 [ %2, %5 ], [ %20, %9 ]
%26 = icmp eq i64 %2, 1
br i1 %26, label %51, label %27
27: ; preds = %21, %27
%28 = phi i32 [ %48, %27 ], [ %23, %21 ]
%29 = phi i32* [ %40, %27 ], [ %24, %21 ]
%30 = phi i64 [ %49, %27 ], [ %25, %21 ]
%31 = getelementptr inbounds i32, i32* %29, i64 1
%32 = load i32, i32* %29
%33 = ashr i32 %28, 8
%34 = xor i32 %32, %28
%35 = and i32 %34, 255
%36 = zext i32 %35 to i64
%37 = getelementptr inbounds [256 x i32], [256 x i32]* @crc_16.crc16_table, i64 0, i64 %36
%38 = load i32, i32* %37
%39 = xor i32 %38, %33
%40 = getelementptr inbounds i32, i32* %29, i64 2
%41 = load i32, i32* %31
%42 = ashr i32 %39, 8
%43 = xor i32 %41, %39
%44 = and i32 %43, 255
%45 = zext i32 %44 to i64
%46 = getelementptr inbounds [256 x i32], [256 x i32]* @crc_16.crc16_table, i64 0, i64 %45
%47 = load i32, i32* %46
%48 = xor i32 %47, %42
%49 = add i64 %30, -2
%50 = icmp eq i64 %49, 0
br i1 %50, label %51, label %27
51: ; preds = %21, %27, %3
%52 = phi i32 [ %0, %3 ], [ %22, %21 ], [ %48, %27 ]
ret i32 %52
}