void csum(unsigned char *buf, int len) {
  unsigned int i, c, csum = 0;
  unsigned int cconst[] = {0,      0x1021, 0x2042, 0x3063, 0x4084, 0x50A5,
                           0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B,
                           0xC18C, 0xD1AD, 0xE1CE, 0xF1EF};
  for (i = 0; i < (len - 2); i++) {
    c = (buf[i] & 0xff);
    csum = ((csum << 4) & 0xffff) ^ cconst[(c >> 4) ^ (csum >> 12)];
    csum = ((csum << 4) & 0xffff) ^ cconst[(c & 0xf) ^ (csum >> 12)];
  }
  buf[len - 2] = (csum >> 8) & 0xff;
  buf[len - 1] = csum & 0xff;
}


x86 assembly (clang, -O0):
<csum>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movl   $0x0,-0x18(%rbp)
lea    -0x60(%rbp),%rdi
lea    0xecf(%rip),%rsi
mov    $0x40,%edx
call   1030 <memcpy@plt>
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x2,%ecx
cmp    %ecx,%eax
jae    11b8 <csum+0xa8>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
movzbl (%rax,%rcx,1),%eax
and    $0xff,%eax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%eax
shl    $0x4,%eax
and    $0xffff,%eax
mov    -0x14(%rbp),%ecx
shr    $0x4,%ecx
mov    -0x18(%rbp),%edx
shr    $0xc,%edx
xor    %edx,%ecx
mov    %ecx,%ecx
xor    -0x60(%rbp,%rcx,4),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
shl    $0x4,%eax
and    $0xffff,%eax
mov    -0x14(%rbp),%ecx
and    $0xf,%ecx
mov    -0x18(%rbp),%edx
shr    $0xc,%edx
xor    %edx,%ecx
mov    %ecx,%ecx
xor    -0x60(%rbp,%rcx,4),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1142 <csum+0x32>
mov    -0x18(%rbp),%eax
shr    $0x8,%eax
and    $0xff,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
and    $0xff,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<csum>:
push   %rbx
mov    %esi,%r8d
add    $0xfffffffe,%r8d
je     115d <csum+0x5d>
mov    %r8d,%r9d
xor    %eax,%eax
lea    0xeea(%rip),%r10
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movzbl (%rdi,%rax,1),%r11d
mov    %edx,%ecx
shl    $0x4,%ecx
movzwl %cx,%ecx
mov    %r11d,%ebx
shr    $0x4,%ebx
shr    $0xc,%edx
xor    %ebx,%edx
xor    (%r10,%rdx,4),%ecx
mov    %ecx,%edx
shl    $0x4,%edx
movzwl %dx,%edx
and    $0xf,%r11d
shr    $0xc,%ecx
xor    %r11d,%ecx
xor    (%r10,%rcx,4),%edx
add    $0x1,%rax
cmp    %rax,%r9
jne    1120 <csum+0x20>
jmp    115f <csum+0x5f>
xor    %edx,%edx
movslq %r8d,%rax
mov    %dh,(%rdi,%rax,1)
movslq %esi,%rax
mov    %dl,-0x1(%rax,%rdi,1)
pop    %rbx
ret

LLVM IR (-O0):
@__const.csum.cconst = [16 x i32] [i32 0, i32 4129, i32 8258, i32 12387, i32 16516, i32 20645, i32 24774, i32 28903, i32 33032, i32 37161, i32 41290, i32 45419, i32 49548, i32 53677, i32 57806, i32 61935]
define void @csum(i8* %0, i32 %1) {
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca [16 x i32]
store i8* %0, i8** %3
store i32 %1, i32* %4
store i32 0, i32* %7
%9 = bitcast [16 x i32]* %8 to i8*
store i32 0, i32* %5
br label %10
10: ; preds = %47, %2
%11 = load i32, i32* %5
%12 = load i32, i32* %4
%13 = sub nsw i32 %12, 2
%14 = icmp ult i32 %11, %13
br i1 %14, label %15, label %50
15: ; preds = %10
%16 = load i8*, i8** %3
%17 = load i32, i32* %5
%18 = zext i32 %17 to i64
%19 = getelementptr inbounds i8, i8* %16, i64 %18
%20 = load i8, i8* %19
%21 = zext i8 %20 to i32
%22 = and i32 %21, 255
store i32 %22, i32* %6
%23 = load i32, i32* %7
%24 = shl i32 %23, 4
%25 = and i32 %24, 65535
%26 = load i32, i32* %6
%27 = lshr i32 %26, 4
%28 = load i32, i32* %7
%29 = lshr i32 %28, 12
%30 = xor i32 %27, %29
%31 = zext i32 %30 to i64
%32 = getelementptr inbounds [16 x i32], [16 x i32]* %8, i64 0, i64 %31
%33 = load i32, i32* %32
%34 = xor i32 %25, %33
store i32 %34, i32* %7
%35 = load i32, i32* %7
%36 = shl i32 %35, 4
%37 = and i32 %36, 65535
%38 = load i32, i32* %6
%39 = and i32 %38, 15
%40 = load i32, i32* %7
%41 = lshr i32 %40, 12
%42 = xor i32 %39, %41
%43 = zext i32 %42 to i64
%44 = getelementptr inbounds [16 x i32], [16 x i32]* %8, i64 0, i64 %43
%45 = load i32, i32* %44
%46 = xor i32 %37, %45
store i32 %46, i32* %7
br label %47
47: ; preds = %15
%48 = load i32, i32* %5
%49 = add i32 %48, 1
store i32 %49, i32* %5
br label %10
50: ; preds = %10
%51 = load i32, i32* %7
%52 = lshr i32 %51, 8
%53 = and i32 %52, 255
%54 = trunc i32 %53 to i8
%55 = load i8*, i8** %3
%56 = load i32, i32* %4
%57 = sub nsw i32 %56, 2
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds i8, i8* %55, i64 %58
store i8 %54, i8* %59
%60 = load i32, i32* %7
%61 = and i32 %60, 255
%62 = trunc i32 %61 to i8
%63 = load i8*, i8** %3
%64 = load i32, i32* %4
%65 = sub nsw i32 %64, 1
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds i8, i8* %63, i64 %66
store i8 %62, i8* %67
ret void
}

LLVM IR (-O2):
@__const.csum.cconst = [16 x i32] [i32 0, i32 4129, i32 8258, i32 12387, i32 16516, i32 20645, i32 24774, i32 28903, i32 33032, i32 37161, i32 41290, i32 45419, i32 49548, i32 53677, i32 57806, i32 61935]
define void @csum(i8* nocapture %0, i32 %1) {
%3 = add i32 %1, -2
%4 = icmp eq i32 %3, 0
br i1 %4, label %33, label %5
5: ; preds = %2
%6 = zext i32 %3 to i64
br label %7
7: ; preds = %5, %7
%8 = phi i64 [ 0, %5 ], [ %31, %7 ]
%9 = phi i32 [ 0, %5 ], [ %30, %7 ]
%10 = getelementptr inbounds i8, i8* %0, i64 %8
%11 = load i8, i8* %10
%12 = zext i8 %11 to i32
%13 = shl i32 %9, 4
%14 = and i32 %13, 65520
%15 = lshr i32 %12, 4
%16 = lshr i32 %9, 12
%17 = xor i32 %15, %16
%18 = zext i32 %17 to i64
%19 = getelementptr inbounds [16 x i32], [16 x i32]* @__const.csum.cconst, i64 0, i64 %18
%20 = load i32, i32* %19
%21 = xor i32 %20, %14
%22 = shl i32 %21, 4
%23 = and i32 %22, 65520
%24 = and i32 %12, 15
%25 = lshr i32 %21, 12
%26 = xor i32 %25, %24
%27 = zext i32 %26 to i64
%28 = getelementptr inbounds [16 x i32], [16 x i32]* @__const.csum.cconst, i64 0, i64 %27
%29 = load i32, i32* %28
%30 = xor i32 %23, %29
%31 = add nuw nsw i64 %8, 1
%32 = icmp eq i64 %31, %6
br i1 %32, label %33, label %7
33: ; preds = %7, %2
%34 = phi i32 [ 0, %2 ], [ %30, %7 ]
%35 = lshr i32 %34, 8
%36 = trunc i32 %35 to i8
%37 = sext i32 %3 to i64
%38 = getelementptr inbounds i8, i8* %0, i64 %37
store i8 %36, i8* %38
%39 = trunc i32 %34 to i8
%40 = add nsw i32 %1, -1
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds i8, i8* %0, i64 %41
store i8 %39, i8* %42
ret void
}