#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 char uint8_t;

/* Variables and functions */
char *MakeCRC(uint8_t *BitString) {
  static char Res[9];
  char CRC[8];
  int i;
  char DoInvert;
  for (i = 0; i < 8; ++i)
    CRC[i] = 0;
  for (i = 0; i < 2; ++i) {
    DoInvert = ('1' == BitString[i]) ^ CRC[7];
    CRC[7] = CRC[6];
    CRC[6] = CRC[5];
    CRC[5] = CRC[4] ^ DoInvert;
    CRC[4] = CRC[3] ^ DoInvert;
    CRC[3] = CRC[2];
    CRC[2] = CRC[1];
    CRC[1] = CRC[0];
    CRC[0] = DoInvert;
  }
  for (i = 0; i < 8; ++i)
    Res[7 - i] = CRC[i] ? '1' : '0';
  Res[8] = 0;
  return (Res);
}


x86 assembly (clang, -O0):
<MakeCRC>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x8,-0x14(%rbp)
jge    1130 <MakeCRC+0x30>
movslq -0x14(%rbp),%rax
movb   $0x0,-0x10(%rbp,%rax,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    110f <MakeCRC+0xf>
movl   $0x0,-0x14(%rbp)
cmpl   $0x2,-0x14(%rbp)
jge    11b1 <MakeCRC+0xb1>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x31,%eax
cmp    %ecx,%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
movsbl -0x9(%rbp),%ecx
xor    %ecx,%eax
mov    %al,-0x15(%rbp)
mov    -0xa(%rbp),%al
mov    %al,-0x9(%rbp)
mov    -0xb(%rbp),%al
mov    %al,-0xa(%rbp)
movsbl -0xc(%rbp),%eax
movsbl -0x15(%rbp),%ecx
xor    %ecx,%eax
mov    %al,-0xb(%rbp)
movsbl -0xd(%rbp),%eax
movsbl -0x15(%rbp),%ecx
xor    %ecx,%eax
mov    %al,-0xc(%rbp)
mov    -0xe(%rbp),%al
mov    %al,-0xd(%rbp)
mov    -0xf(%rbp),%al
mov    %al,-0xe(%rbp)
mov    -0x10(%rbp),%al
mov    %al,-0xf(%rbp)
mov    -0x15(%rbp),%al
mov    %al,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1137 <MakeCRC+0x37>
movl   $0x0,-0x14(%rbp)
cmpl   $0x8,-0x14(%rbp)
jge    1200 <MakeCRC+0x100>
movslq -0x14(%rbp),%rax
movsbl -0x10(%rbp,%rax,1),%edx
mov    $0x30,%eax
mov    $0x31,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,%dl
mov    $0x7,%eax
sub    -0x14(%rbp),%eax
movslq %eax,%rcx
lea    0x2e32(%rip),%rax
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11b8 <MakeCRC+0xb8>
movb   $0x0,0x2e22(%rip)
lea    0x2e13(%rip),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<MakeCRC>:
cmpb   $0x31,(%rdi)
sete   %sil
cmpb   $0x31,0x1(%rdi)
sete   %dl
mov    %esi,%ecx
xor    %dl,%cl
or     $0x30,%dl
mov    %dl,0x2f0d(%rip)
lea    0x2eff(%rip),%rax
or     $0x30,%sil
mov    %sil,0x2efa(%rip)
movw   $0x3030,0x2eef(%rip)
30 30
mov    %dl,0x2ee8(%rip)
or     $0x30,%cl
mov    %cl,0x2ede(%rip)
mov    %sil,0x2ed6(%rip)
movb   $0x30,0x2ece(%rip)
movb   $0x0,0x2ecf(%rip)
ret

LLVM IR (-O0):
@MakeCRC.Res = internal global [9 x i8] zeroinitializer
define i8* @MakeCRC(i8* %0) {
%2 = alloca i8*
%3 = alloca [8 x i8]
%4 = alloca i32
%5 = alloca i8
store i8* %0, i8** %2
store i32 0, i32* %4
br label %6
6: ; preds = %13, %1
%7 = load i32, i32* %4
%8 = icmp slt i32 %7, 8
br i1 %8, label %9, label %16
9: ; preds = %6
%10 = load i32, i32* %4
%11 = sext i32 %10 to i64
%12 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 %11
store i8 0, i8* %12
br label %13
13: ; preds = %9
%14 = load i32, i32* %4
%15 = add nsw i32 %14, 1
store i32 %15, i32* %4
br label %6
16: ; preds = %6
store i32 0, i32* %4
br label %17
17: ; preds = %67, %16
%18 = load i32, i32* %4
%19 = icmp slt i32 %18, 2
br i1 %19, label %20, label %70
20: ; preds = %17
%21 = load i8*, i8** %2
%22 = load i32, i32* %4
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds i8, i8* %21, i64 %23
%25 = load i8, i8* %24
%26 = sext i8 %25 to i32
%27 = icmp eq i32 49, %26
%28 = zext i1 %27 to i32
%29 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 7
%30 = load i8, i8* %29
%31 = sext i8 %30 to i32
%32 = xor i32 %28, %31
%33 = trunc i32 %32 to i8
store i8 %33, i8* %5
%34 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 6
%35 = load i8, i8* %34
%36 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 7
store i8 %35, i8* %36
%37 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 5
%38 = load i8, i8* %37
%39 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 6
store i8 %38, i8* %39
%40 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 4
%41 = load i8, i8* %40
%42 = sext i8 %41 to i32
%43 = load i8, i8* %5
%44 = sext i8 %43 to i32
%45 = xor i32 %42, %44
%46 = trunc i32 %45 to i8
%47 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 5
store i8 %46, i8* %47
%48 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 3
%49 = load i8, i8* %48
%50 = sext i8 %49 to i32
%51 = load i8, i8* %5
%52 = sext i8 %51 to i32
%53 = xor i32 %50, %52
%54 = trunc i32 %53 to i8
%55 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 4
store i8 %54, i8* %55
%56 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 2
%57 = load i8, i8* %56
%58 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 3
store i8 %57, i8* %58
%59 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 1
%60 = load i8, i8* %59
%61 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 2
store i8 %60, i8* %61
%62 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 0
%63 = load i8, i8* %62
%64 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 1
store i8 %63, i8* %64
%65 = load i8, i8* %5
%66 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 0
store i8 %65, i8* %66
br label %67
67: ; preds = %20
%68 = load i32, i32* %4
%69 = add nsw i32 %68, 1
store i32 %69, i32* %4
br label %17
70: ; preds = %17
store i32 0, i32* %4
br label %71
71: ; preds = %88, %70
%72 = load i32, i32* %4
%73 = icmp slt i32 %72, 8
br i1 %73, label %74, label %91
74: ; preds = %71
%75 = load i32, i32* %4
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds [8 x i8], [8 x i8]* %3, i64 0, i64 %76
%78 = load i8, i8* %77
%79 = sext i8 %78 to i32
%80 = icmp ne i32 %79, 0
%81 = zext i1 %80 to i64
%82 = select i1 %80, i32 49, i32 48
%83 = trunc i32 %82 to i8
%84 = load i32, i32* %4
%85 = sub nsw i32 7, %84
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds [9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 %86
store i8 %83, i8* %87
br label %88
88: ; preds = %74
%89 = load i32, i32* %4
%90 = add nsw i32 %89, 1
store i32 %90, i32* %4
br label %71
91: ; preds = %71
store i8 0, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 8)
ret i8* getelementptr inbounds ([9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 0)
}

LLVM IR (-O2):
@MakeCRC.Res = internal global [9 x i8] zeroinitializer
define i8* @MakeCRC(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = icmp eq i8 %2, 49
%4 = getelementptr inbounds i8, i8* %0, i64 1
%5 = load i8, i8* %4
%6 = icmp eq i8 %5, 49
%7 = xor i1 %3, %6
%8 = select i1 %6, i8 49, i8 48
store i8 %8, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 7)
%9 = select i1 %3, i8 49, i8 48
store i8 %9, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 6)
store i8 48, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 5)
store i8 48, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 4)
store i8 %8, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 3)
%10 = select i1 %7, i8 49, i8 48
store i8 %10, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 2)
store i8 %9, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 1)
store i8 48, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 0)
store i8 0, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 8)
ret i8* getelementptr inbounds ([9 x i8], [9 x i8]* @MakeCRC.Res, i64 0, i64 0)
}