unsigned int ls_int_hashcode(const void *key) {
  unsigned long a = ((unsigned long)key) & 0xffffffff;
  a = (a + 0x7ed55d16) + (a << 12);
  a = (a ^ 0xc761c23c) ^ (a >> 19);
  a = (a + 0x165667b1) + (a << 5);
  a = (a + 0xd3a2646c) ^ (a << 9);
  a = (a + 0xfd7046c5) + (a << 3);
  a = (a ^ 0xb55a4f09) ^ (a >> 16);
  return (unsigned int)a;
}


x86 assembly (clang, -O0):
<ls_int_hashcode>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movabs $0xffffffff,%rcx
and    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x7ed55d16,%rax
mov    -0x10(%rbp),%rcx
shl    $0xc,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
movabs $0xc761c23c,%rax
xor    -0x10(%rbp),%rax
mov    -0x10(%rbp),%rcx
shr    $0x13,%rcx
xor    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x165667b1,%rax
mov    -0x10(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
movabs $0xd3a2646c,%rax
add    -0x10(%rbp),%rax
mov    -0x10(%rbp),%rcx
shl    $0x9,%rcx
xor    %rcx,%rax
mov    %rax,-0x10(%rbp)
movabs $0xfd7046c5,%rax
add    -0x10(%rbp),%rax
mov    -0x10(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
movabs $0xb55a4f09,%rax
xor    -0x10(%rbp),%rax
mov    -0x10(%rbp),%rcx
shr    $0x10,%rcx
xor    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ls_int_hashcode>:
mov    %edi,%eax
mov    %rax,%rcx
shl    $0xc,%rcx
add    %rcx,%rax
add    $0x7ed55d16,%rax
mov    %rax,%rcx
shr    $0x13,%rcx
mov    $0xc761c23c,%edx
xor    %rdx,%rax
xor    %rcx,%rax
mov    %rax,%rcx
shl    $0x5,%rcx
lea    (%rax,%rcx,1),%rsi
add    %rcx,%rax
add    $0x165667b1,%rax
lea    (%rdx,%rsi,1),%rcx
add    $0x229709e1,%rcx
shl    $0x9,%rax
xor    %rcx,%rax
lea    (%rax,%rax,8),%rax
lea    (%rdx,%rax,1),%rcx
add    $0x360e8489,%rcx
mov    %rcx,%rax
shr    $0x10,%rax
xor    %ecx,%eax
xor    $0xb55a4f09,%eax
ret

LLVM IR (-O0):
define i32 @ls_int_hashcode(i8* %0) {
%2 = alloca i8*
%3 = alloca i64
store i8* %0, i8** %2
%4 = load i8*, i8** %2
%5 = ptrtoint i8* %4 to i64
%6 = and i64 %5, 4294967295
store i64 %6, i64* %3
%7 = load i64, i64* %3
%8 = add i64 %7, 2127912214
%9 = load i64, i64* %3
%10 = shl i64 %9, 12
%11 = add i64 %8, %10
store i64 %11, i64* %3
%12 = load i64, i64* %3
%13 = xor i64 %12, 3345072700
%14 = load i64, i64* %3
%15 = lshr i64 %14, 19
%16 = xor i64 %13, %15
store i64 %16, i64* %3
%17 = load i64, i64* %3
%18 = add i64 %17, 374761393
%19 = load i64, i64* %3
%20 = shl i64 %19, 5
%21 = add i64 %18, %20
store i64 %21, i64* %3
%22 = load i64, i64* %3
%23 = add i64 %22, 3550635116
%24 = load i64, i64* %3
%25 = shl i64 %24, 9
%26 = xor i64 %23, %25
store i64 %26, i64* %3
%27 = load i64, i64* %3
%28 = add i64 %27, 4251993797
%29 = load i64, i64* %3
%30 = shl i64 %29, 3
%31 = add i64 %28, %30
store i64 %31, i64* %3
%32 = load i64, i64* %3
%33 = xor i64 %32, 3042594569
%34 = load i64, i64* %3
%35 = lshr i64 %34, 16
%36 = xor i64 %33, %35
store i64 %36, i64* %3
%37 = load i64, i64* %3
%38 = trunc i64 %37 to i32
ret i32 %38
}

LLVM IR (-O2):
define i32 @ls_int_hashcode(i8* %0) {
%2 = ptrtoint i8* %0 to i64
%3 = and i64 %2, 4294967295
%4 = add nuw nsw i64 %3, 2127912214
%5 = shl nuw nsw i64 %3, 12
%6 = add nuw nsw i64 %4, %5
%7 = lshr i64 %6, 19
%8 = xor i64 %6, %7
%9 = xor i64 %8, 3345072700
%10 = add nuw nsw i64 %9, 374761393
%11 = shl nuw nsw i64 %9, 5
%12 = add nuw nsw i64 %10, %11
%13 = add i64 %12, 3550635116
%14 = shl i64 %12, 9
%15 = xor i64 %13, %14
%16 = add i64 %15, 4251993797
%17 = shl i64 %15, 3
%18 = add i64 %16, %17
%19 = lshr i64 %18, 16
%20 = xor i64 %19, %18
%21 = trunc i64 %20 to i32
%22 = xor i32 %21, -1252372727
ret i32 %22
}