user: What would the C source look like for the assembly code provided here:

```asm
<swoole_hash_jenkins>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  movb   $0xef,-0xd(%rbp)
  movl   $0x9e3779b9,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %eax,-0x4(%rbp)
  jmp    L19
L29:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  shl    $0x8,%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  shl    $0x10,%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  shl    $0x18,%eax
  add    %edx,%eax
  add    %eax,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x18(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  shl    $0x8,%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  shl    $0x10,%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  shl    $0x18,%eax
  add    %edx,%eax
  add    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  movzbl (%rax),%eax
  mov    %eax,%edx
  movzbl -0xd(%rbp),%eax
  add    %edx,%eax
  mov    %al,-0xd(%rbp)
  mov    -0x8(%rbp),%eax
  sub    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sub    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sar    $0xd,%eax
  xor    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sub    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  sub    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x8,%eax
  xor    %eax,-0x8(%rbp)
  movzbl -0xd(%rbp),%eax
  mov    -0xc(%rbp),%edx
  sub    %edx,%eax
  mov    %al,-0xd(%rbp)
  movzbl -0xd(%rbp),%eax
  mov    -0x8(%rbp),%edx
  sub    %edx,%eax
  mov    %al,-0xd(%rbp)
  mov    -0x8(%rbp),%eax
  shr    $0xd,%eax
  mov    %eax,%edx
  movzbl -0xd(%rbp),%eax
  xor    %edx,%eax
  mov    %al,-0xd(%rbp)
  mov    -0x8(%rbp),%eax
  sub    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sub    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sar    $0xc,%eax
  xor    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sub    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  sub    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x10,%eax
  xor    %eax,-0x8(%rbp)
  movzbl -0xd(%rbp),%eax
  mov    -0xc(%rbp),%edx
  sub    %edx,%eax
  mov    %al,-0xd(%rbp)
  movzbl -0xd(%rbp),%eax
  mov    -0x8(%rbp),%edx
  sub    %edx,%eax
  mov    %al,-0xd(%rbp)
  mov    -0x8(%rbp),%eax
  shr    $0x5,%eax
  mov    %eax,%edx
  movzbl -0xd(%rbp),%eax
  xor    %edx,%eax
  mov    %al,-0xd(%rbp)
  mov    -0x8(%rbp),%eax
  sub    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sub    %eax,-0xc(%rbp)
  movzbl -0xd(%rbp),%eax
  sar    $0x3,%al
  movsbl %al,%eax
  xor    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sub    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  sub    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0xa,%eax
  xor    %eax,-0x8(%rbp)
  movzbl -0xd(%rbp),%eax
  mov    -0xc(%rbp),%edx
  sub    %edx,%eax
  mov    %al,-0xd(%rbp)
  movzbl -0xd(%rbp),%eax
  mov    -0x8(%rbp),%edx
  sub    %edx,%eax
  mov    %al,-0xd(%rbp)
  mov    -0x8(%rbp),%eax
  shr    $0xf,%eax
  mov    %eax,%edx
  movzbl -0xd(%rbp),%eax
  xor    %edx,%eax
  mov    %al,-0xd(%rbp)
  addq   $0xc,-0x18(%rbp)
  subl   $0xc,-0x4(%rbp)
L19:
  cmpl   $0xb,-0x4(%rbp)
  ja     L29
  mov    -0x20(%rbp),%rax
  mov    %eax,%edx
  movzbl -0xd(%rbp),%eax
  add    %edx,%eax
  mov    %al,-0xd(%rbp)
  cmpl   $0xb,-0x4(%rbp)
  ja     L2
  mov    -0x4(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D7(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D7(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x18(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  shl    $0x18,%eax
  add    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  shl    $0x10,%eax
  add    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  shl    $0x8,%eax
  add    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  shl    $0x18,%eax
  add    %eax,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  shl    $0x10,%eax
  add    %eax,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  shl    $0x8,%eax
  add    %eax,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %eax,-0xc(%rbp)
L2:
  mov    -0x8(%rbp),%eax
  sub    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sub    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sar    $0xd,%eax
  xor    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sub    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  sub    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x8,%eax
  xor    %eax,-0x8(%rbp)
  movzbl -0xd(%rbp),%eax
  mov    -0xc(%rbp),%edx
  sub    %edx,%eax
  mov    %al,-0xd(%rbp)
  movzbl -0xd(%rbp),%eax
  mov    -0x8(%rbp),%edx
  sub    %edx,%eax
  mov    %al,-0xd(%rbp)
  mov    -0x8(%rbp),%eax
  shr    $0xd,%eax
  mov    %eax,%edx
  movzbl -0xd(%rbp),%eax
  xor    %edx,%eax
  mov    %al,-0xd(%rbp)
  mov    -0x8(%rbp),%eax
  sub    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sub    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sar    $0xc,%eax
  xor    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sub    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  sub    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x10,%eax
  xor    %eax,-0x8(%rbp)
  movzbl -0xd(%rbp),%eax
  mov    -0xc(%rbp),%edx
  sub    %edx,%eax
  mov    %al,-0xd(%rbp)
  movzbl -0xd(%rbp),%eax
  mov    -0x8(%rbp),%edx
  sub    %edx,%eax
  mov    %al,-0xd(%rbp)
  mov    -0x8(%rbp),%eax
  shr    $0x5,%eax
  mov    %eax,%edx
  movzbl -0xd(%rbp),%eax
  xor    %edx,%eax
  mov    %al,-0xd(%rbp)
  mov    -0x8(%rbp),%eax
  sub    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sub    %eax,-0xc(%rbp)
  movzbl -0xd(%rbp),%eax
  sar    $0x3,%al
  movsbl %al,%eax
  xor    %eax,-0xc(%rbp)
  movsbl -0xd(%rbp),%eax
  sub    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  sub    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0xa,%eax
  xor    %eax,-0x8(%rbp)
  movzbl -0xd(%rbp),%eax
  mov    -0xc(%rbp),%edx
  sub    %edx,%eax
  mov    %al,-0xd(%rbp)
  movzbl -0xd(%rbp),%eax
  mov    -0x8(%rbp),%edx
  sub    %edx,%eax
  mov    %al,-0xd(%rbp)
  mov    -0x8(%rbp),%eax
  shr    $0xf,%eax
  mov    %eax,%edx
  movzbl -0xd(%rbp),%eax
  xor    %edx,%eax
  mov    %al,-0xd(%rbp)
  movzbl -0xd(%rbp),%eax
  pop    %rbp
  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;
}
```