unsigned char CRC8(unsigned char input, unsigned char seed) {
  unsigned char i, feedback;
  for (i = 0; i < 8; i++) {
    feedback = ((seed ^ input) & 0x01);
    if (!feedback)
      seed >>= 1;
    else {
      seed ^= 0x18;
      seed >>= 1;
      seed |= 0x80;
    }
    input >>= 1;
  }
  return seed;
}


x86 assembly (clang, -O0):
<CRC8>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %dil,%cl
mov    %cl,-0x1(%rbp)
mov    %al,-0x2(%rbp)
movb   $0x0,-0x3(%rbp)
movzbl -0x3(%rbp),%eax
cmp    $0x8,%eax
jge    1181 <CRC8+0x81>
movzbl -0x2(%rbp),%eax
movzbl -0x1(%rbp),%ecx
xor    %ecx,%eax
and    $0x1,%eax
mov    %al,-0x4(%rbp)
cmpb   $0x0,-0x4(%rbp)
jne    114a <CRC8+0x4a>
movzbl -0x2(%rbp),%eax
sar    $0x1,%eax
mov    %al,-0x2(%rbp)
jmp    116a <CRC8+0x6a>
movzbl -0x2(%rbp),%eax
xor    $0x18,%eax
mov    %al,-0x2(%rbp)
movzbl -0x2(%rbp),%eax
sar    $0x1,%eax
mov    %al,-0x2(%rbp)
movzbl -0x2(%rbp),%eax
or     $0x80,%eax
mov    %al,-0x2(%rbp)
movzbl -0x1(%rbp),%eax
sar    $0x1,%eax
mov    %al,-0x1(%rbp)
mov    -0x3(%rbp),%al
add    $0x1,%al
mov    %al,-0x3(%rbp)
jmp    1114 <CRC8+0x14>
movzbl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<CRC8>:
mov    %edi,%eax
xor    %sil,%al
shr    %sil
movzbl %sil,%ecx
xor    $0x8c,%sil
test   $0x1,%al
movzbl %sil,%eax
cmove  %ecx,%eax
mov    %edi,%ecx
shr    %cl
xor    %al,%cl
shr    %al
movzbl %al,%edx
xor    $0x8c,%al
test   $0x1,%cl
movzbl %al,%eax
cmove  %edx,%eax
mov    %edi,%ecx
shr    $0x2,%cl
xor    %al,%cl
shr    %al
movzbl %al,%edx
xor    $0x8c,%al
test   $0x1,%cl
movzbl %al,%eax
cmove  %edx,%eax
mov    %edi,%ecx
shr    $0x3,%cl
xor    %al,%cl
shr    %al
movzbl %al,%edx
xor    $0x8c,%al
test   $0x1,%cl
movzbl %al,%eax
cmove  %edx,%eax
mov    %edi,%ecx
shr    $0x4,%cl
xor    %al,%cl
shr    %al
movzbl %al,%edx
xor    $0x8c,%al
test   $0x1,%cl
movzbl %al,%eax
cmove  %edx,%eax
mov    %edi,%ecx
shr    $0x5,%cl
xor    %al,%cl
shr    %al
movzbl %al,%edx
xor    $0x8c,%al
test   $0x1,%cl
movzbl %al,%eax
cmove  %edx,%eax
mov    %edi,%ecx
shr    $0x6,%cl
xor    %al,%cl
shr    %al
movzbl %al,%edx
xor    $0x8c,%al
test   $0x1,%cl
movzbl %al,%eax
cmove  %edx,%eax
shr    $0x7,%dil
mov    %eax,%ecx
and    $0x1,%cl
shr    %al
movzbl %al,%edx
xor    $0x8c,%al
cmp    %cl,%dil
movzbl %al,%eax
cmove  %edx,%eax
ret

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

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