#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int uint8_t;
typedef int uint32_t;
typedef int /*<<< orphan*/ uint16_t;

/* Variables and functions */
uint32_t super_fast_hash(const uint8_t *data, uint32_t len, uint32_t hash) {
  uint32_t tmp;
  int rem = len & 3;
  len >>= 2;
  for (; len > 0; len--) {
    hash += ((((uint32_t)(((const uint8_t *)(data))[1])) << 8) +
             (uint32_t)(((const uint8_t *)(data))[0]));
    tmp = (((((uint32_t)(((const uint8_t *)(data + 2))[1])) << 8) +
            (uint32_t)(((const uint8_t *)(data + 2))[0]))
           << 11) ^
          hash;
    hash = (hash << 16) ^ tmp;
    data += 2 * sizeof(uint16_t);
    hash += hash >> 11;
  }
  switch (rem) {
  case 3:
    hash += ((((uint32_t)(((const uint8_t *)(data))[1])) << 8) +
             (uint32_t)(((const uint8_t *)(data))[0]));
    hash ^= hash << 16;
    hash ^= data[sizeof(uint16_t)] << 18;
    hash += hash >> 11;
    break;
  case 2:
    hash += ((((uint32_t)(((const uint8_t *)(data))[1])) << 8) +
             (uint32_t)(((const uint8_t *)(data))[0]));
    hash ^= hash << 11;
    hash += hash >> 17;
    break;
  case 1:
    hash += *data;
    hash ^= hash << 10;
    hash += hash >> 1;
  }
  hash ^= hash << 3;
  hash += hash >> 5;
  hash ^= hash << 4;
  hash += hash >> 17;
  hash ^= hash << 25;
  hash += hash >> 6;
  return hash;
}


x86 assembly (clang, -O0):
<super_fast_hash>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0xc(%rbp),%eax
and    $0x3,%eax
mov    %eax,-0x18(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x2,%eax
mov    %eax,-0xc(%rbp)
cmpl   $0x0,-0xc(%rbp)
jle    118c <super_fast_hash+0x8c>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
shl    $0x8,%eax
mov    -0x8(%rbp),%rcx
add    (%rcx),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    0xc(%rax),%eax
shl    $0x8,%eax
mov    -0x8(%rbp),%rcx
add    0x8(%rcx),%eax
shl    $0xb,%eax
xor    -0x10(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x10,%eax
xor    -0x14(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
sar    $0xb,%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
jmp    1120 <super_fast_hash+0x20>
mov    -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
sub    $0x1,%eax
je     1238 <super_fast_hash+0x138>
jmp    11a0 <super_fast_hash+0xa0>
mov    -0x1c(%rbp),%eax
sub    $0x2,%eax
je     1205 <super_fast_hash+0x105>
jmp    11b1 <super_fast_hash+0xb1>
mov    -0x1c(%rbp),%eax
sub    $0x3,%eax
jne    125c <super_fast_hash+0x15c>
jmp    11c2 <super_fast_hash+0xc2>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
shl    $0x8,%eax
mov    -0x8(%rbp),%rcx
add    (%rcx),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x10,%eax
xor    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    0x10(%rax),%eax
shl    $0x12,%eax
xor    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
sar    $0xb,%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
jmp    125c <super_fast_hash+0x15c>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
shl    $0x8,%eax
mov    -0x8(%rbp),%rcx
add    (%rcx),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
shl    $0xb,%eax
xor    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
sar    $0x11,%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
jmp    125c <super_fast_hash+0x15c>
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
shl    $0xa,%eax
xor    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
sar    $0x1,%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x3,%eax
xor    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
sar    $0x5,%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x4,%eax
xor    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
sar    $0x11,%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x19,%eax
xor    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
sar    $0x6,%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<super_fast_hash>:
mov    %esi,%r8d
and    $0x3,%r8d
cmp    $0x4,%esi
jl     1152 <super_fast_hash+0x52>
shr    $0x2,%esi
add    $0x1,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    0x4(%rdi),%ecx
mov    0xc(%rdi),%eax
shl    $0x8,%ecx
add    (%rdi),%edx
add    %ecx,%edx
shl    $0x8,%eax
add    0x8(%rdi),%eax
shl    $0xb,%eax
mov    %edx,%ecx
shl    $0x10,%ecx
xor    %edx,%ecx
xor    %eax,%ecx
add    $0x20,%rdi
mov    %ecx,%edx
sar    $0xb,%edx
add    %ecx,%edx
add    $0xffffffff,%esi
cmp    $0x1,%esi
ja     1120 <super_fast_hash+0x20>
cmp    $0x1,%r8d
je     1186 <super_fast_hash+0x86>
cmp    $0x2,%r8d
je     1195 <super_fast_hash+0x95>
cmp    $0x3,%r8d
jne    11ad <super_fast_hash+0xad>
mov    0x4(%rdi),%eax
mov    0x10(%rdi),%ecx
add    (%rdi),%edx
shl    $0x8,%eax
add    %eax,%edx
shl    $0x12,%ecx
xor    %edx,%ecx
shl    $0x10,%edx
xor    %ecx,%edx
mov    %edx,%eax
sar    $0xb,%eax
add    %edx,%eax
mov    %eax,%edx
jmp    11ad <super_fast_hash+0xad>
add    (%rdi),%edx
mov    %edx,%eax
shl    $0xa,%eax
xor    %edx,%eax
mov    %eax,%edx
sar    %edx
jmp    11ab <super_fast_hash+0xab>
mov    0x4(%rdi),%eax
shl    $0x8,%eax
add    (%rdi),%edx
add    %eax,%edx
mov    %edx,%eax
shl    $0xb,%eax
xor    %edx,%eax
mov    %eax,%edx
sar    $0x11,%edx
add    %eax,%edx
lea    0x0(,%rdx,8),%eax
xor    %edx,%eax
mov    %eax,%ecx
sar    $0x5,%ecx
add    %eax,%ecx
mov    %ecx,%eax
shl    $0x4,%eax
xor    %ecx,%eax
mov    %eax,%ecx
sar    $0x11,%ecx
add    %eax,%ecx
mov    %ecx,%edx
shl    $0x19,%edx
xor    %ecx,%edx
mov    %edx,%eax
sar    $0x6,%eax
add    %edx,%eax
ret

LLVM IR (-O0):
define i32 @super_fast_hash(i32* %0, i32 %1, i32 %2) {
%4 = alloca i32*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i32* %0, i32** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%9 = load i32, i32* %5
%10 = and i32 %9, 3
store i32 %10, i32* %8
%11 = load i32, i32* %5
%12 = ashr i32 %11, 2
store i32 %12, i32* %5
br label %13
13: ; preds = %50, %3
%14 = load i32, i32* %5
%15 = icmp sgt i32 %14, 0
br i1 %15, label %16, label %53
16: ; preds = %13
%17 = load i32*, i32** %4
%18 = getelementptr inbounds i32, i32* %17, i64 1
%19 = load i32, i32* %18
%20 = shl i32 %19, 8
%21 = load i32*, i32** %4
%22 = getelementptr inbounds i32, i32* %21, i64 0
%23 = load i32, i32* %22
%24 = add nsw i32 %20, %23
%25 = load i32, i32* %6
%26 = add nsw i32 %25, %24
store i32 %26, i32* %6
%27 = load i32*, i32** %4
%28 = getelementptr inbounds i32, i32* %27, i64 2
%29 = getelementptr inbounds i32, i32* %28, i64 1
%30 = load i32, i32* %29
%31 = shl i32 %30, 8
%32 = load i32*, i32** %4
%33 = getelementptr inbounds i32, i32* %32, i64 2
%34 = getelementptr inbounds i32, i32* %33, i64 0
%35 = load i32, i32* %34
%36 = add nsw i32 %31, %35
%37 = shl i32 %36, 11
%38 = load i32, i32* %6
%39 = xor i32 %37, %38
store i32 %39, i32* %7
%40 = load i32, i32* %6
%41 = shl i32 %40, 16
%42 = load i32, i32* %7
%43 = xor i32 %41, %42
store i32 %43, i32* %6
%44 = load i32*, i32** %4
%45 = getelementptr inbounds i32, i32* %44, i64 8
store i32* %45, i32** %4
%46 = load i32, i32* %6
%47 = ashr i32 %46, 11
%48 = load i32, i32* %6
%49 = add nsw i32 %48, %47
store i32 %49, i32* %6
br label %50
50: ; preds = %16
%51 = load i32, i32* %5
%52 = add nsw i32 %51, -1
store i32 %52, i32* %5
br label %13
53: ; preds = %13
%54 = load i32, i32* %8
switch i32 %54, label %112 [
i32 3, label %55
i32 2, label %80
i32 1, label %99
]
55: ; preds = %53
%56 = load i32*, i32** %4
%57 = getelementptr inbounds i32, i32* %56, i64 1
%58 = load i32, i32* %57
%59 = shl i32 %58, 8
%60 = load i32*, i32** %4
%61 = getelementptr inbounds i32, i32* %60, i64 0
%62 = load i32, i32* %61
%63 = add nsw i32 %59, %62
%64 = load i32, i32* %6
%65 = add nsw i32 %64, %63
store i32 %65, i32* %6
%66 = load i32, i32* %6
%67 = shl i32 %66, 16
%68 = load i32, i32* %6
%69 = xor i32 %68, %67
store i32 %69, i32* %6
%70 = load i32*, i32** %4
%71 = getelementptr inbounds i32, i32* %70, i64 4
%72 = load i32, i32* %71
%73 = shl i32 %72, 18
%74 = load i32, i32* %6
%75 = xor i32 %74, %73
store i32 %75, i32* %6
%76 = load i32, i32* %6
%77 = ashr i32 %76, 11
%78 = load i32, i32* %6
%79 = add nsw i32 %78, %77
store i32 %79, i32* %6
br label %112
80: ; preds = %53
%81 = load i32*, i32** %4
%82 = getelementptr inbounds i32, i32* %81, i64 1
%83 = load i32, i32* %82
%84 = shl i32 %83, 8
%85 = load i32*, i32** %4
%86 = getelementptr inbounds i32, i32* %85, i64 0
%87 = load i32, i32* %86
%88 = add nsw i32 %84, %87
%89 = load i32, i32* %6
%90 = add nsw i32 %89, %88
store i32 %90, i32* %6
%91 = load i32, i32* %6
%92 = shl i32 %91, 11
%93 = load i32, i32* %6
%94 = xor i32 %93, %92
store i32 %94, i32* %6
%95 = load i32, i32* %6
%96 = ashr i32 %95, 17
%97 = load i32, i32* %6
%98 = add nsw i32 %97, %96
store i32 %98, i32* %6
br label %112
99: ; preds = %53
%100 = load i32*, i32** %4
%101 = load i32, i32* %100
%102 = load i32, i32* %6
%103 = add nsw i32 %102, %101
store i32 %103, i32* %6
%104 = load i32, i32* %6
%105 = shl i32 %104, 10
%106 = load i32, i32* %6
%107 = xor i32 %106, %105
store i32 %107, i32* %6
%108 = load i32, i32* %6
%109 = ashr i32 %108, 1
%110 = load i32, i32* %6
%111 = add nsw i32 %110, %109
store i32 %111, i32* %6
br label %112
112: ; preds = %99, %53, %80, %55
%113 = load i32, i32* %6
%114 = shl i32 %113, 3
%115 = load i32, i32* %6
%116 = xor i32 %115, %114
store i32 %116, i32* %6
%117 = load i32, i32* %6
%118 = ashr i32 %117, 5
%119 = load i32, i32* %6
%120 = add nsw i32 %119, %118
store i32 %120, i32* %6
%121 = load i32, i32* %6
%122 = shl i32 %121, 4
%123 = load i32, i32* %6
%124 = xor i32 %123, %122
store i32 %124, i32* %6
%125 = load i32, i32* %6
%126 = ashr i32 %125, 17
%127 = load i32, i32* %6
%128 = add nsw i32 %127, %126
store i32 %128, i32* %6
%129 = load i32, i32* %6
%130 = shl i32 %129, 25
%131 = load i32, i32* %6
%132 = xor i32 %131, %130
store i32 %132, i32* %6
%133 = load i32, i32* %6
%134 = ashr i32 %133, 6
%135 = load i32, i32* %6
%136 = add nsw i32 %135, %134
store i32 %136, i32* %6
%137 = load i32, i32* %6
ret i32 %137
}

LLVM IR (-O2):
define i32 @super_fast_hash(i32* nocapture %0, i32 %1, i32 %2) {
%4 = and i32 %1, 3
%5 = icmp sgt i32 %1, 3
br i1 %5, label %6, label %33
6: ; preds = %3
%7 = lshr i32 %1, 2
br label %8
8: ; preds = %6, %8
%9 = phi i32* [ %28, %8 ], [ %0, %6 ]
%10 = phi i32 [ %31, %8 ], [ %7, %6 ]
%11 = phi i32 [ %30, %8 ], [ %2, %6 ]
%12 = getelementptr inbounds i32, i32* %9, i64 1
%13 = load i32, i32* %12
%14 = shl i32 %13, 8
%15 = load i32, i32* %9
%16 = add i32 %15, %11
%17 = add i32 %16, %14
%18 = getelementptr inbounds i32, i32* %9, i64 2
%19 = getelementptr inbounds i32, i32* %9, i64 3
%20 = load i32, i32* %19
%21 = shl i32 %20, 8
%22 = load i32, i32* %18
%23 = add nsw i32 %21, %22
%24 = shl i32 %23, 11
%25 = shl i32 %17, 16
%26 = xor i32 %25, %17
%27 = xor i32 %26, %24
%28 = getelementptr inbounds i32, i32* %9, i64 8
%29 = ashr i32 %27, 11
%30 = add nsw i32 %29, %27
%31 = add nsw i32 %10, -1
%32 = icmp ugt i32 %10, 1
br i1 %32, label %8, label %33
33: ; preds = %8, %3
%34 = phi i32 [ %2, %3 ], [ %30, %8 ]
%35 = phi i32* [ %0, %3 ], [ %28, %8 ]
switch i32 %4, label %69 [
i32 3, label %36
i32 2, label %51
i32 1, label %62
]
36: ; preds = %33
%37 = getelementptr inbounds i32, i32* %35, i64 1
%38 = load i32, i32* %37
%39 = shl i32 %38, 8
%40 = load i32, i32* %35
%41 = add i32 %40, %34
%42 = add i32 %41, %39
%43 = shl i32 %42, 16
%44 = getelementptr inbounds i32, i32* %35, i64 4
%45 = load i32, i32* %44
%46 = shl i32 %45, 18
%47 = xor i32 %46, %42
%48 = xor i32 %47, %43
%49 = ashr i32 %48, 11
%50 = add nsw i32 %49, %48
br label %69
51: ; preds = %33
%52 = getelementptr inbounds i32, i32* %35, i64 1
%53 = load i32, i32* %52
%54 = shl i32 %53, 8
%55 = load i32, i32* %35
%56 = add i32 %55, %34
%57 = add i32 %56, %54
%58 = shl i32 %57, 11
%59 = xor i32 %58, %57
%60 = ashr i32 %59, 17
%61 = add nsw i32 %60, %59
br label %69
62: ; preds = %33
%63 = load i32, i32* %35
%64 = add nsw i32 %63, %34
%65 = shl i32 %64, 10
%66 = xor i32 %65, %64
%67 = ashr i32 %66, 1
%68 = add nsw i32 %67, %66
br label %69
69: ; preds = %62, %33, %51, %36
%70 = phi i32 [ %34, %33 ], [ %68, %62 ], [ %61, %51 ], [ %50, %36 ]
%71 = shl i32 %70, 3
%72 = xor i32 %71, %70
%73 = ashr i32 %72, 5
%74 = add nsw i32 %73, %72
%75 = shl i32 %74, 4
%76 = xor i32 %75, %74
%77 = ashr i32 %76, 17
%78 = add nsw i32 %77, %76
%79 = shl i32 %78, 25
%80 = xor i32 %79, %78
%81 = ashr i32 %80, 6
%82 = add nsw i32 %81, %80
ret i32 %82
}