unsigned short calcCRC(unsigned short seed, unsigned short poly,
                       unsigned short data) {
  unsigned short index;
  unsigned short crc = seed;
  for (index = 8; index; index--) {
    if ((data ^ crc) & 0x0001) {
      crc = (crc >> 1) ^ poly;
    } else {
      crc >>= 1;
    }
    data >>= 1;
  }
  return (crc);
}


x86 assembly (clang, -O0):
<calcCRC>:
push   %rbp
mov    %rsp,%rbp
mov    %dx,%ax
mov    %si,%cx
mov    %di,%dx
mov    %dx,-0x2(%rbp)
mov    %cx,-0x4(%rbp)
mov    %ax,-0x6(%rbp)
mov    -0x2(%rbp),%ax
mov    %ax,-0xa(%rbp)
movw   $0x8,-0x8(%rbp)
cmpw   $0x0,-0x8(%rbp)
je     1185 <calcCRC+0x85>
movzwl -0x6(%rbp),%eax
movzwl -0xa(%rbp),%ecx
xor    %ecx,%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     115e <calcCRC+0x5e>
movzwl -0xa(%rbp),%eax
sar    $0x1,%eax
movzwl -0x4(%rbp),%ecx
xor    %ecx,%eax
mov    %ax,-0xa(%rbp)
jmp    1169 <calcCRC+0x69>
movzwl -0xa(%rbp),%eax
sar    $0x1,%eax
mov    %ax,-0xa(%rbp)
movzwl -0x6(%rbp),%eax
sar    $0x1,%eax
mov    %ax,-0x6(%rbp)
mov    -0x8(%rbp),%ax
add    $0xffff,%ax
mov    %ax,-0x8(%rbp)
jmp    1127 <calcCRC+0x27>
movzwl -0xa(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<calcCRC>:
mov    %edi,%eax
xor    %edx,%eax
and    $0x1,%eax
neg    %eax
shr    %edi
and    %esi,%eax
xor    %edi,%eax
mov    %edx,%ecx
shr    %ecx
xor    %eax,%ecx
and    $0x1,%ecx
neg    %ecx
shr    %eax
and    %esi,%ecx
xor    %eax,%ecx
mov    %edx,%eax
shr    $0x2,%eax
xor    %ecx,%eax
and    $0x1,%eax
neg    %eax
shr    %ecx
and    %esi,%eax
xor    %ecx,%eax
mov    %edx,%ecx
shr    $0x3,%ecx
xor    %eax,%ecx
and    $0x1,%ecx
neg    %ecx
shr    %eax
and    %esi,%ecx
xor    %eax,%ecx
mov    %edx,%eax
shr    $0x4,%eax
xor    %ecx,%eax
and    $0x1,%eax
neg    %eax
shr    %ecx
and    %esi,%eax
xor    %ecx,%eax
mov    %edx,%ecx
shr    $0x5,%ecx
xor    %eax,%ecx
and    $0x1,%ecx
neg    %ecx
shr    %eax
and    %esi,%ecx
xor    %eax,%ecx
mov    %edx,%eax
shr    $0x6,%eax
xor    %ecx,%eax
and    $0x1,%eax
neg    %eax
shr    %ecx
and    %esi,%eax
xor    %ecx,%eax
shr    $0x7,%edx
xor    %eax,%edx
and    $0x1,%edx
neg    %edx
shr    %eax
and    %esi,%edx
xor    %edx,%eax
ret

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

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