user: What is the c source code of the assembly code below:

```asm
<swoole_hash_jenkins>:
  endbr64
  mov    %rdi,%rcx
  mov    %rsi,%rdi
  cmp    $0xb,%esi
  jbe    L18
  mov    $0x9e3779b9,%edx
  mov    $0x9e3779b9,%r9d
  mov    $0xffffffef,%eax
L13:
  movsbl 0x5(%rcx),%r8d
  shl    $0x8,%r8d
  movsbl 0x6(%rcx),%r10d
  shl    $0x10,%r10d
  add    %r10d,%r8d
  movsbl 0x4(%rcx),%r10d
  add    %r10d,%r8d
  movsbl 0x7(%rcx),%r10d
  shl    $0x18,%r10d
  add    %r10d,%r8d
  add    %edx,%r8d
  add    0x8(%rcx),%al
  movsbl %al,%r10d
  movsbl 0x1(%rcx),%edx
  shl    $0x8,%edx
  movsbl 0x2(%rcx),%r11d
  shl    $0x10,%r11d
  add    %r11d,%edx
  movsbl (%rcx),%r11d
  add    %r11d,%edx
  movsbl 0x3(%rcx),%r11d
  shl    $0x18,%r11d
  add    %r11d,%edx
  sub    %r10d,%edx
  sub    %r8d,%edx
  add    %r9d,%edx
  mov    %r10d,%r9d
  sar    $0xd,%r9d
  xor    %r9d,%edx
  sub    %r10d,%r8d
  mov    %r8d,%r9d
  sub    %edx,%r9d
  mov    %edx,%r8d
  shl    $0x8,%r8d
  xor    %r9d,%r8d
  sub    %edx,%eax
  sub    %r8d,%eax
  mov    %r8d,%r9d
  shr    $0xd,%r9d
  xor    %r9d,%eax
  sub    %r8d,%edx
  movsbl %al,%r10d
  sub    %r10d,%edx
  mov    %r10d,%r9d
  sar    $0xc,%r9d
  xor    %edx,%r9d
  sub    %r10d,%r8d
  sub    %r9d,%r8d
  mov    %r9d,%edx
  shl    $0x10,%edx
  xor    %r8d,%edx
  sub    %r9d,%eax
  sub    %edx,%eax
  mov    %edx,%r8d
  shr    $0x5,%r8d
  xor    %r8d,%eax
  sub    %edx,%r9d
  movsbl %al,%r10d
  sub    %r10d,%r9d
  mov    %r9d,%r8d
  mov    %eax,%r9d
  sar    $0x3,%r9b
  movsbl %r9b,%r9d
  xor    %r8d,%r9d
  sub    %r10d,%edx
  sub    %r9d,%edx
  mov    %r9d,%r8d
  shl    $0xa,%r8d
  xor    %r8d,%edx
  sub    %r9d,%eax
  sub    %edx,%eax
  mov    %edx,%r8d
  shr    $0xf,%r8d
  xor    %r8d,%eax
  add    $0xc,%rcx
  sub    $0xc,%esi
  cmp    $0xb,%esi
  ja     L13
L24:
  add    %edi,%eax
  cmp    $0xb,%esi
  ja     L10
  mov    %esi,%esi
  lea    D3(%rip),%rdi
  movslq (%rdi,%rsi,4),%rsi
  add    %rdi,%rsi
  notrack jmp *%rsi
L18:
  mov    $0x9e3779b9,%edx
  mov    $0x9e3779b9,%r9d
  mov    $0xffffffef,%eax
  jmp    L24
  movsbl 0x7(%rcx),%esi
  shl    $0x18,%esi
  add    %esi,%edx
  movsbl 0x6(%rcx),%esi
  shl    $0x10,%esi
  add    %esi,%edx
  movsbl 0x5(%rcx),%esi
  shl    $0x8,%esi
  add    %esi,%edx
  movsbl 0x4(%rcx),%esi
  add    %esi,%edx
  movsbl 0x3(%rcx),%esi
  shl    $0x18,%esi
  add    %esi,%r9d
  movsbl 0x2(%rcx),%esi
  shl    $0x10,%esi
  add    %esi,%r9d
  movsbl 0x1(%rcx),%esi
  shl    $0x8,%esi
  add    %esi,%r9d
  movsbl (%rcx),%ecx
  add    %ecx,%r9d
L10:
  movsbl %al,%ecx
  sub    %ecx,%r9d
  sub    %edx,%r9d
  mov    %ecx,%esi
  sar    $0xd,%esi
  xor    %r9d,%esi
  sub    %ecx,%edx
  sub    %esi,%edx
  mov    %esi,%ecx
  shl    $0x8,%ecx
  xor    %ecx,%edx
  sub    %esi,%eax
  sub    %edx,%eax
  mov    %edx,%ecx
  shr    $0xd,%ecx
  xor    %ecx,%eax
  sub    %edx,%esi
  movsbl %al,%edi
  sub    %edi,%esi
  mov    %edi,%ecx
  sar    $0xc,%ecx
  xor    %esi,%ecx
  sub    %edi,%edx
  mov    %edx,%esi
  sub    %ecx,%esi
  mov    %ecx,%edx
  shl    $0x10,%edx
  xor    %esi,%edx
  sub    %ecx,%eax
  sub    %edx,%eax
  mov    %edx,%esi
  shr    $0x5,%esi
  xor    %esi,%eax
  sub    %edx,%ecx
  movsbl %al,%edi
  sub    %edi,%ecx
  mov    %eax,%esi
  sar    $0x3,%sil
  movsbl %sil,%esi
  xor    %esi,%ecx
  sub    %edi,%edx
  sub    %ecx,%edx
  mov    %ecx,%esi
  shl    $0xa,%esi
  xor    %esi,%edx
  sub    %ecx,%eax
  sub    %edx,%eax
  shr    $0xf,%edx
  xor    %edx,%eax
  ret
```

assistant: ```c
uint64_t swoole_hash_jenkins(char *key, uint32_t keylen) {
  uint64_t hashv;
  unsigned i, j, k;
  hashv = 0xfeedbeef;
  i = j = 0x9e3779b9;
  k = (unsigned)(keylen);
  while (k >= 12) {
    i += (key[0] + ((unsigned)key[1] << 8) + ((unsigned)key[2] << 16) + ((unsigned)key[3] << 24));
    j += (key[4] + ((unsigned)key[5] << 8) + ((unsigned)key[6] << 16) + ((unsigned)key[7] << 24));
    hashv += (key[8] + ((unsigned)key[9] << 8) + ((unsigned)key[10] << 16) + ((unsigned)key[11] << 24));
    do {
      i -= j;
      i -= hashv;
      i ^= (hashv >> 13);
      j -= hashv;
      j -= i;
      j ^= (i << 8);
      hashv -= i;
      hashv -= j;
      hashv ^= (j >> 13);
      i -= j;
      i -= hashv;
      i ^= (hashv >> 12);
      j -= hashv;
      j -= i;
      j ^= (i << 16);
      hashv -= i;
      hashv -= j;
      hashv ^= (j >> 5);
      i -= j;
      i -= hashv;
      i ^= (hashv >> 3);
      j -= hashv;
      j -= i;
      j ^= (i << 10);
      hashv -= i;
      hashv -= j;
      hashv ^= (j >> 15);
    } while (0);
    key += 12;
    k -= 12;
  }
  hashv += keylen;
  switch (k) {
  case 11:
    hashv += ((unsigned)key[10] << 24);
  case 10:
    hashv += ((unsigned)key[9] << 16);
  case 9:
    hashv += ((unsigned)key[8] << 8);
  case 8:
    j += ((unsigned)key[7] << 24);
  case 7:
    j += ((unsigned)key[6] << 16);
  case 6:
    j += ((unsigned)key[5] << 8);
  case 5:
    j += key[4];
  case 4:
    i += ((unsigned)key[3] << 24);
  case 3:
    i += ((unsigned)key[2] << 16);
  case 2:
    i += ((unsigned)key[1] << 8);
  case 1:
    i += key[0];
  }
  do {
    i -= j;
    i -= hashv;
    i ^= (hashv >> 13);
    j -= hashv;
    j -= i;
    j ^= (i << 8);
    hashv -= i;
    hashv -= j;
    hashv ^= (j >> 13);
    i -= j;
    i -= hashv;
    i ^= (hashv >> 12);
    j -= hashv;
    j -= i;
    j ^= (i << 16);
    hashv -= i;
    hashv -= j;
    hashv ^= (j >> 5);
    i -= j;
    i -= hashv;
    i ^= (hashv >> 3);
    j -= hashv;
    j -= i;
    j ^= (i << 10);
    hashv -= i;
    hashv -= j;
    hashv ^= (j >> 15);
  } while (0);
  return hashv;
}
```