unsigned short GetCCITT(unsigned short crc, unsigned short ch) {
  static unsigned int i;
  ch <<= 8;
  for (i = 8; i > 0; i--) {
    if ((ch ^ crc) & 0X8000)
      crc = (crc << 1) ^ 0x1021;
    else
      crc <<= 1;
    ch <<= 1;
  }
  return (crc);
}


x86 assembly (clang, -O0):
<GetCCITT>:
push   %rbp
mov    %rsp,%rbp
mov    %si,%ax
mov    %di,%cx
mov    %cx,-0x2(%rbp)
mov    %ax,-0x4(%rbp)
movzwl -0x4(%rbp),%eax
shl    $0x8,%eax
mov    %ax,-0x4(%rbp)
movl   $0x8,0x2efd(%rip)
cmpl   $0x0,0x2ef6(%rip)
jbe    118b <GetCCITT+0x8b>
movzwl -0x4(%rbp),%eax
movzwl -0x2(%rbp),%ecx
xor    %ecx,%eax
and    $0x8000,%eax
cmp    $0x0,%eax
je     1161 <GetCCITT+0x61>
movzwl -0x2(%rbp),%eax
shl    $0x1,%eax
xor    $0x1021,%eax
mov    %ax,-0x2(%rbp)
jmp    116c <GetCCITT+0x6c>
movzwl -0x2(%rbp),%eax
shl    $0x1,%eax
mov    %ax,-0x2(%rbp)
movzwl -0x4(%rbp),%eax
shl    $0x1,%eax
mov    %ax,-0x4(%rbp)
mov    0x2ea7(%rip),%eax
add    $0xffffffff,%eax
mov    %eax,0x2e9e(%rip)
jmp    1127 <GetCCITT+0x27>
movzwl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<GetCCITT>:
mov    %esi,%eax
shl    $0x8,%eax
lea    (%rdi,%rdi,1),%ecx
mov    %ecx,%edx
xor    $0x1021,%edx
xor    %di,%ax
cmovns %ecx,%edx
mov    %esi,%eax
shl    $0x9,%eax
mov    %edx,%ecx
add    %edx,%ecx
mov    %ecx,%edi
xor    $0x1021,%edi
xor    %dx,%ax
cmovns %ecx,%edi
mov    %esi,%eax
shl    $0xa,%eax
mov    %edi,%ecx
add    %edi,%ecx
mov    %ecx,%edx
xor    $0x1021,%edx
xor    %di,%ax
cmovns %ecx,%edx
mov    %esi,%eax
shl    $0xb,%eax
mov    %edx,%ecx
add    %edx,%ecx
mov    %ecx,%edi
xor    $0x1021,%edi
xor    %dx,%ax
cmovns %ecx,%edi
mov    %esi,%eax
shl    $0xc,%eax
mov    %edi,%ecx
add    %edi,%ecx
mov    %ecx,%edx
xor    $0x1021,%edx
xor    %di,%ax
cmovns %ecx,%edx
mov    %esi,%eax
shl    $0xd,%eax
mov    %edx,%ecx
add    %edx,%ecx
mov    %ecx,%edi
xor    $0x1021,%edi
xor    %dx,%ax
cmovns %ecx,%edi
mov    %esi,%eax
shl    $0xe,%eax
mov    %edi,%ecx
add    %edi,%ecx
mov    %ecx,%edx
xor    $0x1021,%edx
xor    %di,%ax
cmovns %ecx,%edx
shl    $0xf,%esi
mov    %edx,%ecx
add    %edx,%ecx
mov    %ecx,%eax
xor    $0x1021,%eax
xor    %dx,%si
cmovns %ecx,%eax
ret

LLVM IR (-O0):
@GetCCITT.i = internal global i32 0
define zeroext i16 @GetCCITT(i16 zeroext %0, i16 zeroext %1) {
%3 = alloca i16
%4 = alloca i16
store i16 %0, i16* %3
store i16 %1, i16* %4
%5 = load i16, i16* %4
%6 = zext i16 %5 to i32
%7 = shl i32 %6, 8
%8 = trunc i32 %7 to i16
store i16 %8, i16* %4
store i32 8, i32* @GetCCITT.i
br label %9
9: ; preds = %36, %2
%10 = load i32, i32* @GetCCITT.i
%11 = icmp ugt i32 %10, 0
br i1 %11, label %12, label %39
12: ; preds = %9
%13 = load i16, i16* %4
%14 = zext i16 %13 to i32
%15 = load i16, i16* %3
%16 = zext i16 %15 to i32
%17 = xor i32 %14, %16
%18 = and i32 %17, 32768
%19 = icmp ne i32 %18, 0
br i1 %19, label %20, label %26
20: ; preds = %12
%21 = load i16, i16* %3
%22 = zext i16 %21 to i32
%23 = shl i32 %22, 1
%24 = xor i32 %23, 4129
%25 = trunc i32 %24 to i16
store i16 %25, i16* %3
br label %31
26: ; preds = %12
%27 = load i16, i16* %3
%28 = zext i16 %27 to i32
%29 = shl i32 %28, 1
%30 = trunc i32 %29 to i16
store i16 %30, i16* %3
br label %31
31: ; preds = %26, %20
%32 = load i16, i16* %4
%33 = zext i16 %32 to i32
%34 = shl i32 %33, 1
%35 = trunc i32 %34 to i16
store i16 %35, i16* %4
br label %36
36: ; preds = %31
%37 = load i32, i32* @GetCCITT.i
%38 = add i32 %37, -1
store i32 %38, i32* @GetCCITT.i
br label %9
39: ; preds = %9
%40 = load i16, i16* %3
ret i16 %40
}

LLVM IR (-O2):
define zeroext i16 @GetCCITT(i16 zeroext %0, i16 zeroext %1) {
%3 = shl i16 %1, 8
%4 = xor i16 %3, %0
%5 = icmp sgt i16 %4, -1
%6 = shl i16 %0, 1
%7 = xor i16 %6, 4129
%8 = select i1 %5, i16 %6, i16 %7
%9 = shl i16 %1, 9
%10 = xor i16 %9, %8
%11 = icmp sgt i16 %10, -1
%12 = shl i16 %8, 1
%13 = xor i16 %12, 4129
%14 = select i1 %11, i16 %12, i16 %13
%15 = shl i16 %1, 10
%16 = xor i16 %15, %14
%17 = icmp sgt i16 %16, -1
%18 = shl i16 %14, 1
%19 = xor i16 %18, 4129
%20 = select i1 %17, i16 %18, i16 %19
%21 = shl i16 %1, 11
%22 = xor i16 %21, %20
%23 = icmp sgt i16 %22, -1
%24 = shl i16 %20, 1
%25 = xor i16 %24, 4129
%26 = select i1 %23, i16 %24, i16 %25
%27 = shl i16 %1, 12
%28 = xor i16 %27, %26
%29 = icmp sgt i16 %28, -1
%30 = shl i16 %26, 1
%31 = xor i16 %30, 4129
%32 = select i1 %29, i16 %30, i16 %31
%33 = shl i16 %1, 13
%34 = xor i16 %33, %32
%35 = icmp sgt i16 %34, -1
%36 = shl i16 %32, 1
%37 = xor i16 %36, 4129
%38 = select i1 %35, i16 %36, i16 %37
%39 = shl i16 %1, 14
%40 = xor i16 %39, %38
%41 = icmp sgt i16 %40, -1
%42 = shl i16 %38, 1
%43 = xor i16 %42, 4129
%44 = select i1 %41, i16 %42, i16 %43
%45 = shl i16 %1, 15
%46 = xor i16 %45, %44
%47 = icmp sgt i16 %46, -1
%48 = shl i16 %44, 1
%49 = xor i16 %48, 4129
%50 = select i1 %47, i16 %48, i16 %49
ret i16 %50
}