unsigned int crc32r(const unsigned char *buff, int len) {
  static unsigned int crcs[256] = {0};
  unsigned int crc;
  int i, j;
  if (!crcs[1]) {
    for (i = 0; i < 256; i++) {
      crc = (unsigned int)i;
      for (j = 0; j < 8; j++) {
        if (crc & 1)
          crc = (crc >> 1) ^ 0xEDB88320u;
        else
          crc >>= 1;
      }
      crcs[i] = crc;
    }
  }
  for (crc = 0xFFFFFFFFu, i = 0; i < len; i++) {
    crc = (crc >> 8) ^ crcs[(int)(crc ^ buff[i]) & 255];
  }
  return crc ^ 0xFFFFFFFFu;
}


x86 assembly (clang, -O0):
<crc32r>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
cmpl   $0x0,0x2f22(%rip)
jne    11a5 <crc32r+0xa5>
movl   $0x0,-0x14(%rbp)
cmpl   $0x100,-0x14(%rbp)
jge    11a0 <crc32r+0xa0>
mov    -0x14(%rbp),%eax
mov    %eax,-0x10(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x8,-0x18(%rbp)
jge    1181 <crc32r+0x81>
mov    -0x10(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1165 <crc32r+0x65>
mov    -0x10(%rbp),%eax
shr    $0x1,%eax
xor    $0xedb88320,%eax
mov    %eax,-0x10(%rbp)
jmp    116e <crc32r+0x6e>
mov    -0x10(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1173 <crc32r+0x73>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1139 <crc32r+0x39>
mov    -0x10(%rbp),%edx
movslq -0x14(%rbp),%rcx
lea    0x2ea1(%rip),%rax
mov    %edx,(%rax,%rcx,4)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    111f <crc32r+0x1f>
jmp    11a5 <crc32r+0xa5>
movl   $0xffffffff,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11fa <crc32r+0xfa>
mov    -0x10(%rbp),%eax
shr    $0x8,%eax
mov    -0x10(%rbp),%ecx
mov    -0x8(%rbp),%rdx
movslq -0x14(%rbp),%rsi
movzbl (%rdx,%rsi,1),%edx
xor    %edx,%ecx
and    $0xff,%ecx
movslq %ecx,%rdx
lea    0x2e4a(%rip),%rcx
xor    (%rcx,%rdx,4),%eax
mov    %eax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11b3 <crc32r+0xb3>
mov    -0x10(%rbp),%eax
xor    $0xffffffff,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<crc32r>:
cmpl   $0x0,0x2f2d(%rip)
jne    1285 <crc32r+0x185>
movdqa 0xeeb(%rip),%xmm0
xor    %eax,%eax
movdqa 0xef1(%rip),%xmm1
lea    0x2f0a(%rip),%rcx
movdqa 0xef2(%rip),%xmm2
xchg   %ax,%ax
movdqa %xmm0,%xmm3
psrld  $0x1,%xmm3
movdqa %xmm0,%xmm4
pslld  $0x1f,%xmm4
psrad  $0x1f,%xmm4
movdqa %xmm4,%xmm5
pandn  %xmm3,%xmm5
pxor   %xmm1,%xmm3
pand   %xmm4,%xmm3
por    %xmm5,%xmm3
movdqa %xmm3,%xmm4
psrld  $0x1,%xmm4
pslld  $0x1f,%xmm3
psrad  $0x1f,%xmm3
movdqa %xmm3,%xmm5
pandn  %xmm4,%xmm5
pxor   %xmm1,%xmm4
pand   %xmm3,%xmm4
por    %xmm5,%xmm4
movdqa %xmm4,%xmm3
psrld  $0x1,%xmm3
pslld  $0x1f,%xmm4
psrad  $0x1f,%xmm4
movdqa %xmm4,%xmm5
pandn  %xmm3,%xmm5
pxor   %xmm1,%xmm3
pand   %xmm4,%xmm3
por    %xmm5,%xmm3
movdqa %xmm3,%xmm4
psrld  $0x1,%xmm4
pslld  $0x1f,%xmm3
psrad  $0x1f,%xmm3
movdqa %xmm3,%xmm5
pandn  %xmm4,%xmm5
pxor   %xmm1,%xmm4
pand   %xmm3,%xmm4
por    %xmm5,%xmm4
movdqa %xmm4,%xmm3
psrld  $0x1,%xmm3
pslld  $0x1f,%xmm4
psrad  $0x1f,%xmm4
movdqa %xmm4,%xmm5
pandn  %xmm3,%xmm5
pxor   %xmm1,%xmm3
pand   %xmm4,%xmm3
por    %xmm5,%xmm3
movdqa %xmm3,%xmm4
psrld  $0x1,%xmm4
pslld  $0x1f,%xmm3
psrad  $0x1f,%xmm3
movdqa %xmm3,%xmm5
pandn  %xmm4,%xmm5
pxor   %xmm1,%xmm4
pand   %xmm3,%xmm4
por    %xmm5,%xmm4
movdqa %xmm4,%xmm3
psrld  $0x1,%xmm3
pslld  $0x1f,%xmm4
psrad  $0x1f,%xmm4
movdqa %xmm4,%xmm5
pandn  %xmm3,%xmm5
pxor   %xmm1,%xmm3
pand   %xmm4,%xmm3
por    %xmm5,%xmm3
movdqa %xmm3,%xmm4
psrld  $0x1,%xmm4
pslld  $0x1f,%xmm3
psrad  $0x1f,%xmm3
movdqa %xmm3,%xmm5
pandn  %xmm4,%xmm5
pxor   %xmm1,%xmm4
pand   %xmm3,%xmm4
por    %xmm5,%xmm4
movdqa %xmm4,(%rax,%rcx,1)
paddd  %xmm2,%xmm0
add    $0x10,%rax
cmp    $0x400,%rax
jne    1130 <crc32r+0x30>
test   %esi,%esi
jle    129a <crc32r+0x19a>
mov    %esi,%r8d
cmp    $0x1,%esi
jne    129d <crc32r+0x19d>
mov    $0xffffffff,%eax
xor    %edx,%edx
jmp    12ea <crc32r+0x1ea>
xor    %eax,%eax
ret
mov    %r8d,%r9d
and    $0xfffffffe,%r9d
mov    $0xffffffff,%eax
xor    %edx,%edx
lea    0x2d7e(%rip),%r10
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl %al,%esi
shr    $0x8,%eax
movzbl (%rdi,%rdx,1),%ecx
xor    %ecx,%esi
xor    (%r10,%rsi,4),%eax
movzbl %al,%ecx
shr    $0x8,%eax
movzbl 0x1(%rdi,%rdx,1),%esi
xor    %esi,%ecx
xor    (%r10,%rcx,4),%eax
add    $0x2,%rdx
cmp    %rdx,%r9
jne    12c0 <crc32r+0x1c0>
test   $0x1,%r8b
je     1306 <crc32r+0x206>
movzbl %al,%ecx
shr    $0x8,%eax
movzbl (%rdi,%rdx,1),%edx
xor    %edx,%ecx
lea    0x2d2d(%rip),%rdx
xor    (%rdx,%rcx,4),%eax
not    %eax
ret

LLVM IR (-O0):
@crc32r.crcs = internal global [256 x i32] zeroinitializer
define i32 @crc32r(i8* %0, i32 %1) {
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store i8* %0, i8** %3
store i32 %1, i32* %4
%8 = load i32, i32* getelementptr inbounds ([256 x i32], [256 x i32]* @crc32r.crcs, i64 0, i64 1)
%9 = icmp ne i32 %8, 0
br i1 %9, label %43, label %10
10: ; preds = %2
store i32 0, i32* %6
br label %11
11: ; preds = %39, %10
%12 = load i32, i32* %6
%13 = icmp slt i32 %12, 256
br i1 %13, label %14, label %42
14: ; preds = %11
%15 = load i32, i32* %6
store i32 %15, i32* %5
store i32 0, i32* %7
br label %16
16: ; preds = %31, %14
%17 = load i32, i32* %7
%18 = icmp slt i32 %17, 8
br i1 %18, label %19, label %34
19: ; preds = %16
%20 = load i32, i32* %5
%21 = and i32 %20, 1
%22 = icmp ne i32 %21, 0
br i1 %22, label %23, label %27
23: ; preds = %19
%24 = load i32, i32* %5
%25 = lshr i32 %24, 1
%26 = xor i32 %25, -306674912
store i32 %26, i32* %5
br label %30
27: ; preds = %19
%28 = load i32, i32* %5
%29 = lshr i32 %28, 1
store i32 %29, i32* %5
br label %30
30: ; preds = %27, %23
br label %31
31: ; preds = %30
%32 = load i32, i32* %7
%33 = add nsw i32 %32, 1
store i32 %33, i32* %7
br label %16
34: ; preds = %16
%35 = load i32, i32* %5
%36 = load i32, i32* %6
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32r.crcs, i64 0, i64 %37
store i32 %35, i32* %38
br label %39
39: ; preds = %34
%40 = load i32, i32* %6
%41 = add nsw i32 %40, 1
store i32 %41, i32* %6
br label %11
42: ; preds = %11
br label %43
43: ; preds = %42, %2
store i32 -1, i32* %5
store i32 0, i32* %6
br label %44
44: ; preds = %64, %43
%45 = load i32, i32* %6
%46 = load i32, i32* %4
%47 = icmp slt i32 %45, %46
br i1 %47, label %48, label %67
48: ; preds = %44
%49 = load i32, i32* %5
%50 = lshr i32 %49, 8
%51 = load i32, i32* %5
%52 = load i8*, i8** %3
%53 = load i32, i32* %6
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds i8, i8* %52, i64 %54
%56 = load i8, i8* %55
%57 = zext i8 %56 to i32
%58 = xor i32 %51, %57
%59 = and i32 %58, 255
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32r.crcs, i64 0, i64 %60
%62 = load i32, i32* %61
%63 = xor i32 %50, %62
store i32 %63, i32* %5
br label %64
64: ; preds = %48
%65 = load i32, i32* %6
%66 = add nsw i32 %65, 1
store i32 %66, i32* %6
br label %44
67: ; preds = %44
%68 = load i32, i32* %5
%69 = xor i32 %68, -1
ret i32 %69
}

LLVM IR (-O2):
@crc32r.crcs = internal unnamed_addr global [256 x i32] zeroinitializer
define i32 @crc32r(i8* nocapture %0, i32 %1) {
%3 = load i32, i32* getelementptr inbounds ([256 x i32], [256 x i32]* @crc32r.crcs, i64 0, i64 1)
%4 = icmp eq i32 %3, 0
br i1 %4, label %5, label %53
5: ; preds = %2, %5
%6 = phi i64 [ %50, %5 ], [ 0, %2 ]
%7 = phi <4 x i32> [ %51, %5 ], [ <i32 0, i32 1, i32 2, i32 3>, %2 ]
%8 = and <4 x i32> %7, <i32 1, i32 1, i32 1, i32 1>
%9 = icmp eq <4 x i32> %8, zeroinitializer
%10 = lshr <4 x i32> %7, <i32 1, i32 1, i32 1, i32 1>
%11 = xor <4 x i32> %10, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%12 = select <4 x i1> %9, <4 x i32> %10, <4 x i32> %11
%13 = and <4 x i32> %12, <i32 1, i32 1, i32 1, i32 1>
%14 = icmp eq <4 x i32> %13, zeroinitializer
%15 = lshr <4 x i32> %12, <i32 1, i32 1, i32 1, i32 1>
%16 = xor <4 x i32> %15, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%17 = select <4 x i1> %14, <4 x i32> %15, <4 x i32> %16
%18 = and <4 x i32> %17, <i32 1, i32 1, i32 1, i32 1>
%19 = icmp eq <4 x i32> %18, zeroinitializer
%20 = lshr <4 x i32> %17, <i32 1, i32 1, i32 1, i32 1>
%21 = xor <4 x i32> %20, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%22 = select <4 x i1> %19, <4 x i32> %20, <4 x i32> %21
%23 = and <4 x i32> %22, <i32 1, i32 1, i32 1, i32 1>
%24 = icmp eq <4 x i32> %23, zeroinitializer
%25 = lshr <4 x i32> %22, <i32 1, i32 1, i32 1, i32 1>
%26 = xor <4 x i32> %25, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%27 = select <4 x i1> %24, <4 x i32> %25, <4 x i32> %26
%28 = and <4 x i32> %27, <i32 1, i32 1, i32 1, i32 1>
%29 = icmp eq <4 x i32> %28, zeroinitializer
%30 = lshr <4 x i32> %27, <i32 1, i32 1, i32 1, i32 1>
%31 = xor <4 x i32> %30, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%32 = select <4 x i1> %29, <4 x i32> %30, <4 x i32> %31
%33 = and <4 x i32> %32, <i32 1, i32 1, i32 1, i32 1>
%34 = icmp eq <4 x i32> %33, zeroinitializer
%35 = lshr <4 x i32> %32, <i32 1, i32 1, i32 1, i32 1>
%36 = xor <4 x i32> %35, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%37 = select <4 x i1> %34, <4 x i32> %35, <4 x i32> %36
%38 = and <4 x i32> %37, <i32 1, i32 1, i32 1, i32 1>
%39 = icmp eq <4 x i32> %38, zeroinitializer
%40 = lshr <4 x i32> %37, <i32 1, i32 1, i32 1, i32 1>
%41 = xor <4 x i32> %40, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%42 = select <4 x i1> %39, <4 x i32> %40, <4 x i32> %41
%43 = and <4 x i32> %42, <i32 1, i32 1, i32 1, i32 1>
%44 = icmp eq <4 x i32> %43, zeroinitializer
%45 = lshr <4 x i32> %42, <i32 1, i32 1, i32 1, i32 1>
%46 = xor <4 x i32> %45, <i32 -306674912, i32 -306674912, i32 -306674912, i32 -306674912>
%47 = select <4 x i1> %44, <4 x i32> %45, <4 x i32> %46
%48 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32r.crcs, i64 0, i64 %6
%49 = bitcast i32* %48 to <4 x i32>*
store <4 x i32> %47, <4 x i32>* %49
%50 = add nuw i64 %6, 4
%51 = add <4 x i32> %7, <i32 4, i32 4, i32 4, i32 4>
%52 = icmp eq i64 %50, 256
br i1 %52, label %53, label %5
53: ; preds = %5, %2
%54 = icmp sgt i32 %1, 0
br i1 %54, label %55, label %108
55: ; preds = %53
%56 = zext i32 %1 to i64
%57 = and i64 %56, 1
%58 = icmp eq i32 %1, 1
br i1 %58, label %89, label %59
59: ; preds = %55
%60 = and i64 %56, 4294967294
br label %61
61: ; preds = %61, %59
%62 = phi i64 [ 0, %59 ], [ %86, %61 ]
%63 = phi i32 [ -1, %59 ], [ %85, %61 ]
%64 = phi i64 [ 0, %59 ], [ %87, %61 ]
%65 = lshr i32 %63, 8
%66 = getelementptr inbounds i8, i8* %0, i64 %62
%67 = load i8, i8* %66
%68 = zext i8 %67 to i32
%69 = and i32 %63, 255
%70 = xor i32 %69, %68
%71 = zext i32 %70 to i64
%72 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32r.crcs, i64 0, i64 %71
%73 = load i32, i32* %72
%74 = xor i32 %73, %65
%75 = or i64 %62, 1
%76 = lshr i32 %74, 8
%77 = getelementptr inbounds i8, i8* %0, i64 %75
%78 = load i8, i8* %77
%79 = zext i8 %78 to i32
%80 = and i32 %74, 255
%81 = xor i32 %80, %79
%82 = zext i32 %81 to i64
%83 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32r.crcs, i64 0, i64 %82
%84 = load i32, i32* %83
%85 = xor i32 %84, %76
%86 = add nuw nsw i64 %62, 2
%87 = add i64 %64, 2
%88 = icmp eq i64 %87, %60
br i1 %88, label %89, label %61
89: ; preds = %61, %55
%90 = phi i32 [ undef, %55 ], [ %85, %61 ]
%91 = phi i64 [ 0, %55 ], [ %86, %61 ]
%92 = phi i32 [ -1, %55 ], [ %85, %61 ]
%93 = icmp eq i64 %57, 0
br i1 %93, label %105, label %94
94: ; preds = %89
%95 = lshr i32 %92, 8
%96 = getelementptr inbounds i8, i8* %0, i64 %91
%97 = load i8, i8* %96
%98 = zext i8 %97 to i32
%99 = and i32 %92, 255
%100 = xor i32 %99, %98
%101 = zext i32 %100 to i64
%102 = getelementptr inbounds [256 x i32], [256 x i32]* @crc32r.crcs, i64 0, i64 %101
%103 = load i32, i32* %102
%104 = xor i32 %103, %95
br label %105
105: ; preds = %89, %94
%106 = phi i32 [ %90, %89 ], [ %104, %94 ]
%107 = xor i32 %106, -1
br label %108
108: ; preds = %105, %53
%109 = phi i32 [ 0, %53 ], [ %107, %105 ]
ret i32 %109
}