int lzo_adler32(int adler, char *buf) {
  int s1 = adler;
  int s2 = adler;
  s1 += buf[0];
  s2 += s1;
  s1 += buf[1];
  s2 += s1;
  s1 += buf[2];
  s2 += s1;
  s1 += buf[3];
  s2 += s1;
  s1 += buf[4];
  s2 += s1;
  s1 += buf[5];
  s2 += s1;
  s1 += buf[6];
  s2 += s1;
  s1 += buf[7];
  s2 += s1;
  return (s2 << 16) + s1;
}


x86 assembly (clang, -O0):
<lzo_adler32>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x4(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x4(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl 0x3(%rax),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl 0x5(%rax),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl 0x6(%rax),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl 0x7(%rax),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
shl    $0x10,%eax
add    -0x14(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<lzo_adler32>:
movsbl (%rsi),%ecx
add    %edi,%ecx
lea    (%rdi,%rcx,1),%eax
movsbl 0x1(%rsi),%edx
add    %ecx,%edx
add    %edx,%eax
movsbl 0x2(%rsi),%ecx
add    %edx,%ecx
add    %ecx,%eax
movsbl 0x3(%rsi),%edx
add    %ecx,%edx
add    %edx,%eax
movsbl 0x4(%rsi),%ecx
add    %edx,%ecx
add    %ecx,%eax
movsbl 0x5(%rsi),%edx
add    %ecx,%edx
add    %edx,%eax
movsbl 0x6(%rsi),%ecx
add    %edx,%ecx
add    %ecx,%eax
movsbl 0x7(%rsi),%edx
add    %ecx,%edx
add    %edx,%eax
shl    $0x10,%eax
add    %edx,%eax
ret

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

LLVM IR (-O2):
define i32 @lzo_adler32(i32 %0, i8* nocapture %1) {
%3 = load i8, i8* %1
%4 = sext i8 %3 to i32
%5 = add nsw i32 %4, %0
%6 = add nsw i32 %5, %0
%7 = getelementptr inbounds i8, i8* %1, i64 1
%8 = load i8, i8* %7
%9 = sext i8 %8 to i32
%10 = add nsw i32 %5, %9
%11 = add nsw i32 %6, %10
%12 = getelementptr inbounds i8, i8* %1, i64 2
%13 = load i8, i8* %12
%14 = sext i8 %13 to i32
%15 = add nsw i32 %10, %14
%16 = add nsw i32 %11, %15
%17 = getelementptr inbounds i8, i8* %1, i64 3
%18 = load i8, i8* %17
%19 = sext i8 %18 to i32
%20 = add nsw i32 %15, %19
%21 = add nsw i32 %16, %20
%22 = getelementptr inbounds i8, i8* %1, i64 4
%23 = load i8, i8* %22
%24 = sext i8 %23 to i32
%25 = add nsw i32 %20, %24
%26 = add nsw i32 %21, %25
%27 = getelementptr inbounds i8, i8* %1, i64 5
%28 = load i8, i8* %27
%29 = sext i8 %28 to i32
%30 = add nsw i32 %25, %29
%31 = add nsw i32 %26, %30
%32 = getelementptr inbounds i8, i8* %1, i64 6
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = add nsw i32 %30, %34
%36 = add nsw i32 %31, %35
%37 = getelementptr inbounds i8, i8* %1, i64 7
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = add nsw i32 %35, %39
%41 = add nsw i32 %36, %40
%42 = shl i32 %41, 16
%43 = add nsw i32 %42, %40
ret i32 %43
}