unsigned char digimax_checksum(unsigned char *buf) {
  unsigned char sum1, sum2;
  sum1 = ~((buf[0] >> 4) + (buf[0] & 0x0fu) + (buf[1] >> 4) + (buf[1] & 0x0fu) +
           (buf[2] >> 4) + (buf[2] & 0x0fu)) &
         0x0fu;
  sum2 = ~((buf[3] >> 4) + (buf[3] & 0x0fu) + (buf[4] >> 4) + (buf[4] & 0x0fu) +
           (buf[5] >> 4) + (buf[5] & 0x0fu)) &
         0x0fu;
  return 0xffu;
}


x86 assembly (clang, -O0):
<digimax_checksum>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movzbl (%rax),%eax
sar    $0x4,%eax
mov    -0x8(%rbp),%rcx
movzbl (%rcx),%ecx
and    $0xf,%ecx
add    %ecx,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
sar    $0x4,%ecx
add    %ecx,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
and    $0xf,%ecx
add    %ecx,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
sar    $0x4,%ecx
add    %ecx,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
and    $0xf,%ecx
add    %ecx,%eax
xor    $0xffffffff,%eax
and    $0xf,%eax
mov    %al,-0x9(%rbp)
mov    -0x8(%rbp),%rax
movzbl 0x3(%rax),%eax
sar    $0x4,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x3(%rcx),%ecx
and    $0xf,%ecx
add    %ecx,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x4(%rcx),%ecx
sar    $0x4,%ecx
add    %ecx,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x4(%rcx),%ecx
and    $0xf,%ecx
add    %ecx,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x5(%rcx),%ecx
sar    $0x4,%ecx
add    %ecx,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x5(%rcx),%ecx
and    $0xf,%ecx
add    %ecx,%eax
xor    $0xffffffff,%eax
and    $0xf,%eax
mov    %al,-0xa(%rbp)
mov    $0xff,%al
movzbl %al,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<digimax_checksum>:
mov    $0xff,%al
ret

LLVM IR (-O0):
define zeroext i8 @digimax_checksum(i8* %0) {
%2 = alloca i8*
%3 = alloca i8
%4 = alloca i8
store i8* %0, i8** %2
%5 = load i8*, i8** %2
%6 = getelementptr inbounds i8, i8* %5, i64 0
%7 = load i8, i8* %6
%8 = zext i8 %7 to i32
%9 = ashr i32 %8, 4
%10 = load i8*, i8** %2
%11 = getelementptr inbounds i8, i8* %10, i64 0
%12 = load i8, i8* %11
%13 = zext i8 %12 to i32
%14 = and i32 %13, 15
%15 = add i32 %9, %14
%16 = load i8*, i8** %2
%17 = getelementptr inbounds i8, i8* %16, i64 1
%18 = load i8, i8* %17
%19 = zext i8 %18 to i32
%20 = ashr i32 %19, 4
%21 = add i32 %15, %20
%22 = load i8*, i8** %2
%23 = getelementptr inbounds i8, i8* %22, i64 1
%24 = load i8, i8* %23
%25 = zext i8 %24 to i32
%26 = and i32 %25, 15
%27 = add i32 %21, %26
%28 = load i8*, i8** %2
%29 = getelementptr inbounds i8, i8* %28, i64 2
%30 = load i8, i8* %29
%31 = zext i8 %30 to i32
%32 = ashr i32 %31, 4
%33 = add i32 %27, %32
%34 = load i8*, i8** %2
%35 = getelementptr inbounds i8, i8* %34, i64 2
%36 = load i8, i8* %35
%37 = zext i8 %36 to i32
%38 = and i32 %37, 15
%39 = add i32 %33, %38
%40 = xor i32 %39, -1
%41 = and i32 %40, 15
%42 = trunc i32 %41 to i8
store i8 %42, i8* %3
%43 = load i8*, i8** %2
%44 = getelementptr inbounds i8, i8* %43, i64 3
%45 = load i8, i8* %44
%46 = zext i8 %45 to i32
%47 = ashr i32 %46, 4
%48 = load i8*, i8** %2
%49 = getelementptr inbounds i8, i8* %48, i64 3
%50 = load i8, i8* %49
%51 = zext i8 %50 to i32
%52 = and i32 %51, 15
%53 = add i32 %47, %52
%54 = load i8*, i8** %2
%55 = getelementptr inbounds i8, i8* %54, i64 4
%56 = load i8, i8* %55
%57 = zext i8 %56 to i32
%58 = ashr i32 %57, 4
%59 = add i32 %53, %58
%60 = load i8*, i8** %2
%61 = getelementptr inbounds i8, i8* %60, i64 4
%62 = load i8, i8* %61
%63 = zext i8 %62 to i32
%64 = and i32 %63, 15
%65 = add i32 %59, %64
%66 = load i8*, i8** %2
%67 = getelementptr inbounds i8, i8* %66, i64 5
%68 = load i8, i8* %67
%69 = zext i8 %68 to i32
%70 = ashr i32 %69, 4
%71 = add i32 %65, %70
%72 = load i8*, i8** %2
%73 = getelementptr inbounds i8, i8* %72, i64 5
%74 = load i8, i8* %73
%75 = zext i8 %74 to i32
%76 = and i32 %75, 15
%77 = add i32 %71, %76
%78 = xor i32 %77, -1
%79 = and i32 %78, 15
%80 = trunc i32 %79 to i8
store i8 %80, i8* %4
ret i8 -1
}

LLVM IR (-O2):
define zeroext i8 @digimax_checksum(i8* nocapture readnone %0) {
ret i8 -1
}