int wr_hashfun_prime(const char *s) {
  int primeflag[32] = {0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0,
                       0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1};
  int mask = 0x1F;
  int i = 0;
  int pValue = 0;
  int nValue = 0;
  int ret;
  while (*s) {
    if (i < 32 && primeflag[i])
      pValue ^= *s;
    else
      nValue ^= *s;
    ++s;
    ++i;
  }
  ret = pValue & mask;
  ret <<= 5;
  ret += nValue & mask;
  return ret;
}


x86 assembly (clang, -O0):
<wr_hashfun_prime>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
mov    %rdi,-0x8(%rbp)
lea    -0x90(%rbp),%rdi
lea    0xed3(%rip),%rsi
mov    $0x80,%edx
call   1030 <memcpy@plt>
movl   $0x1f,-0x94(%rbp)
movl   $0x0,-0x98(%rbp)
movl   $0x0,-0x9c(%rbp)
movl   $0x0,-0xa0(%rbp)
mov    -0x8(%rbp),%rax
cmpb   $0x0,(%rax)
je     11d9 <wr_hashfun_prime+0xc9>
cmpl   $0x20,-0x98(%rbp)
jge    11a6 <wr_hashfun_prime+0x96>
movslq -0x98(%rbp),%rax
cmpl   $0x0,-0x90(%rbp,%rax,4)
je     11a6 <wr_hashfun_prime+0x96>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
xor    -0x9c(%rbp),%eax
mov    %eax,-0x9c(%rbp)
jmp    11b9 <wr_hashfun_prime+0xa9>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
xor    -0xa0(%rbp),%eax
mov    %eax,-0xa0(%rbp)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x98(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x98(%rbp)
jmp    115f <wr_hashfun_prime+0x4f>
mov    -0x9c(%rbp),%eax
and    -0x94(%rbp),%eax
mov    %eax,-0xa4(%rbp)
mov    -0xa4(%rbp),%eax
shl    $0x5,%eax
mov    %eax,-0xa4(%rbp)
mov    -0xa0(%rbp),%eax
and    -0x94(%rbp),%eax
add    -0xa4(%rbp),%eax
mov    %eax,-0xa4(%rbp)
mov    -0xa4(%rbp),%eax
add    $0xb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<wr_hashfun_prime>:
mov    (%rdi),%cl
test   %cl,%cl
je     1145 <wr_hashfun_prime+0x45>
xor    %edx,%edx
mov    $0x5f75d753,%r8d
xor    %eax,%eax
xor    %esi,%esi
jmp    1132 <wr_hashfun_prime+0x32>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzbl %cl,%ecx
xor    %ecx,%eax
movzbl 0x1(%rdi,%rdx,1),%ecx
add    $0x1,%rdx
test   %cl,%cl
je     1149 <wr_hashfun_prime+0x49>
cmp    $0x1f,%rdx
ja     1120 <wr_hashfun_prime+0x20>
bt     %rdx,%r8
jb     1120 <wr_hashfun_prime+0x20>
movzbl %cl,%ecx
xor    %ecx,%esi
jmp    1125 <wr_hashfun_prime+0x25>
xor    %esi,%esi
xor    %eax,%eax
and    $0x1f,%esi
shl    $0x5,%esi
and    $0x1f,%eax
or     %esi,%eax
ret

LLVM IR (-O0):
@__const.wr_hashfun_prime.primeflag = [32 x i32] [i32 0, i32 0, i32 1, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0, i32 1]
define i32 @wr_hashfun_prime(i8* %0) {
%2 = alloca i8*
%3 = alloca [32 x i32]
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i8* %0, i8** %2
%9 = bitcast [32 x i32]* %3 to i8*
store i32 31, i32* %4
store i32 0, i32* %5
store i32 0, i32* %6
store i32 0, i32* %7
br label %10
10: ; preds = %35, %1
%11 = load i8*, i8** %2
%12 = load i8, i8* %11
%13 = icmp ne i8 %12, 0
br i1 %13, label %14, label %40
14: ; preds = %10
%15 = load i32, i32* %5
%16 = icmp slt i32 %15, 32
br i1 %16, label %17, label %29
17: ; preds = %14
%18 = load i32, i32* %5
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds [32 x i32], [32 x i32]* %3, i64 0, i64 %19
%21 = load i32, i32* %20
%22 = icmp ne i32 %21, 0
br i1 %22, label %23, label %29
23: ; preds = %17
%24 = load i8*, i8** %2
%25 = load i8, i8* %24
%26 = sext i8 %25 to i32
%27 = load i32, i32* %6
%28 = xor i32 %27, %26
store i32 %28, i32* %6
br label %35
29: ; preds = %17, %14
%30 = load i8*, i8** %2
%31 = load i8, i8* %30
%32 = sext i8 %31 to i32
%33 = load i32, i32* %7
%34 = xor i32 %33, %32
store i32 %34, i32* %7
br label %35
35: ; preds = %29, %23
%36 = load i8*, i8** %2
%37 = getelementptr inbounds i8, i8* %36, i32 1
store i8* %37, i8** %2
%38 = load i32, i32* %5
%39 = add nsw i32 %38, 1
store i32 %39, i32* %5
br label %10
40: ; preds = %10
%41 = load i32, i32* %6
%42 = load i32, i32* %4
%43 = and i32 %41, %42
store i32 %43, i32* %8
%44 = load i32, i32* %8
%45 = shl i32 %44, 5
store i32 %45, i32* %8
%46 = load i32, i32* %7
%47 = load i32, i32* %4
%48 = and i32 %46, %47
%49 = load i32, i32* %8
%50 = add nsw i32 %49, %48
store i32 %50, i32* %8
%51 = load i32, i32* %8
ret i32 %51
}

LLVM IR (-O2):
define i32 @wr_hashfun_prime(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = icmp eq i8 %2, 0
br i1 %3, label %28, label %4
4: ; preds = %1, %21
%5 = phi i64 [ %25, %21 ], [ 0, %1 ]
%6 = phi i8 [ %26, %21 ], [ %2, %1 ]
%7 = phi i8* [ %24, %21 ], [ %0, %1 ]
%8 = phi i32 [ %23, %21 ], [ 0, %1 ]
%9 = phi i32 [ %22, %21 ], [ 0, %1 ]
%10 = icmp ult i64 %5, 32
br i1 %10, label %11, label %18
11: ; preds = %4
%12 = lshr i64 1601558355, %5
%13 = and i64 %12, 1
%14 = icmp eq i64 %13, 0
br i1 %14, label %15, label %18
15: ; preds = %11
%16 = zext i8 %6 to i32
%17 = xor i32 %9, %16
br label %21
18: ; preds = %11, %4
%19 = zext i8 %6 to i32
%20 = xor i32 %8, %19
br label %21
21: ; preds = %18, %15
%22 = phi i32 [ %17, %15 ], [ %9, %18 ]
%23 = phi i32 [ %8, %15 ], [ %20, %18 ]
%24 = getelementptr inbounds i8, i8* %7, i64 1
%25 = add nuw i64 %5, 1
%26 = load i8, i8* %24
%27 = icmp eq i8 %26, 0
br i1 %27, label %28, label %4
28: ; preds = %21, %1
%29 = phi i32 [ 0, %1 ], [ %22, %21 ]
%30 = phi i32 [ 0, %1 ], [ %23, %21 ]
%31 = shl i32 %29, 5
%32 = and i32 %31, 992
%33 = and i32 %30, 31
%34 = or i32 %32, %33
ret i32 %34
}