// File: attractivechaos[P]udb2/stb/./stb.h
// Function: stb_hash_fast
unsigned int stb_hash_fast(void *p, int len)
{
   unsigned char *q = (unsigned char *) p;
   unsigned int hash = len;

   if (len <= 0 || q == NULL) return 0;

   /* Main loop */
   if (((int) q & 1) == 0) {
      for (;len > 3; len -= 4) {
         unsigned int val;
         hash +=  stb__get16(q);
         val   = (stb__get16(q+2) << 11);
         hash  = (hash << 16) ^ hash ^ val;
         q    += 4;
         hash += hash >> 11;
      }
   } else {
      for (;len > 3; len -= 4) {
         unsigned int val;
         hash +=  stb__get16_slow(q);
         val   = (stb__get16_slow(q+2) << 11);
         hash  = (hash << 16) ^ hash ^ val;
         q    += 4;
         hash += hash >> 11;
      }
   }

   /* Handle end cases */
   switch (len) {
      case 3: hash += stb__get16_slow(q);
              hash ^= hash << 16;
              hash ^= q[2] << 18;
              hash += hash >> 11;
              break;
      case 2: hash += stb__get16_slow(q);
              hash ^= hash << 11;
              hash += hash >> 17;
              break;
      case 1: hash += q[0];
              hash ^= hash << 10;
              hash += hash >> 1;
              break;
      case 0: break;
   }

   /* Force "avalanching" of final 127 bits */
   hash ^= hash << 3;
   hash += hash >> 5;
   hash ^= hash << 4;
   hash += hash >> 17;
   hash ^= hash << 25;
   hash += hash >> 6;

   return hash;
}

// Assembly:
movq %rdi, -0x10(%rsp)
movl %esi, -0x14(%rsp)
movq -0x10(%rsp), %rax
movq %rax, -0x20(%rsp)
movl -0x14(%rsp), %eax
movl %eax, -0x24(%rsp)
cmpl $0x0, -0x14(%rsp)
jle 0x84ca
cmpq $0x0, -0x20(%rsp)
jne 0x84d7
movl $0x0, -0x4(%rsp)
jmp 0x873e
movq -0x20(%rsp), %rax
andl $0x1, %eax
cmpl $0x0, %eax
jne 0x856f
jmp 0x84ea
cmpl $0x3, -0x14(%rsp)
jle 0x856a
movq -0x20(%rsp), %rax
movzbl (%rax), %eax
movq -0x20(%rsp), %rcx
movzbl 0x1(%rcx), %ecx
shll $0x8, %ecx
addl %ecx, %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movq -0x20(%rsp), %rax
movzbl 0x2(%rax), %eax
movq -0x20(%rsp), %rcx
movzbl 0x3(%rcx), %ecx
shll $0x8, %ecx
addl %ecx, %eax
shll $0xb, %eax
movl %eax, -0x28(%rsp)
movl -0x24(%rsp), %eax
shll $0x10, %eax
xorl -0x24(%rsp), %eax
xorl -0x28(%rsp), %eax
movl %eax, -0x24(%rsp)
movq -0x20(%rsp), %rax
addq $0x4, %rax
movq %rax, -0x20(%rsp)
movl -0x24(%rsp), %eax
shrl $0xb, %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x14(%rsp), %eax
subl $0x4, %eax
movl %eax, -0x14(%rsp)
jmp 0x84ea
jmp 0x85f3
jmp 0x8571
cmpl $0x3, -0x14(%rsp)
jle 0x85f1
movq -0x20(%rsp), %rax
movzbl (%rax), %eax
movq -0x20(%rsp), %rcx
movzbl 0x1(%rcx), %ecx
shll $0x8, %ecx
addl %ecx, %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movq -0x20(%rsp), %rax
movzbl 0x2(%rax), %eax
movq -0x20(%rsp), %rcx
movzbl 0x3(%rcx), %ecx
shll $0x8, %ecx
addl %ecx, %eax
shll $0xb, %eax
movl %eax, -0x2c(%rsp)
movl -0x24(%rsp), %eax
shll $0x10, %eax
xorl -0x24(%rsp), %eax
xorl -0x2c(%rsp), %eax
movl %eax, -0x24(%rsp)
movq -0x20(%rsp), %rax
addq $0x4, %rax
movq %rax, -0x20(%rsp)
movl -0x24(%rsp), %eax
shrl $0xb, %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x14(%rsp), %eax
subl $0x4, %eax
movl %eax, -0x14(%rsp)
jmp 0x8571
jmp 0x85f3
movl -0x14(%rsp), %eax
movq %rax, -0x38(%rsp)
subq $0x3, %rax
ja 0x86dc
movq -0x38(%rsp), %rax
leaq 0x16ab2(%rip), %rcx     # 0x1f0c4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x20(%rsp), %rax
movzbl (%rax), %eax
movq -0x20(%rsp), %rcx
movzbl 0x1(%rcx), %ecx
shll $0x8, %ecx
addl %ecx, %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x24(%rsp), %eax
shll $0x10, %eax
xorl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movq -0x20(%rsp), %rax
movzbl 0x2(%rax), %eax
shll $0x12, %eax
xorl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x24(%rsp), %eax
shrl $0xb, %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
jmp 0x86dc
movq -0x20(%rsp), %rax
movzbl (%rax), %eax
movq -0x20(%rsp), %rcx
movzbl 0x1(%rcx), %ecx
shll $0x8, %ecx
addl %ecx, %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x24(%rsp), %eax
shll $0xb, %eax
xorl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x24(%rsp), %eax
shrl $0x11, %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
jmp 0x86dc
movq -0x20(%rsp), %rax
movzbl (%rax), %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x24(%rsp), %eax
shll $0xa, %eax
xorl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x24(%rsp), %eax
shrl %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
jmp 0x86dc
jmp 0x86dc
movl -0x24(%rsp), %eax
shll $0x3, %eax
xorl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x24(%rsp), %eax
shrl $0x5, %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x24(%rsp), %eax
shll $0x4, %eax
xorl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x24(%rsp), %eax
shrl $0x11, %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x24(%rsp), %eax
shll $0x19, %eax
xorl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x24(%rsp), %eax
shrl $0x6, %eax
addl -0x24(%rsp), %eax
movl %eax, -0x24(%rsp)
movl -0x24(%rsp), %eax
movl %eax, -0x4(%rsp)
movl -0x4(%rsp), %eax
retq
nopw %cs:(%rax,%rax)