user: 请从给定的汇编指令推导出C源代码：

```asm
<hash_djb2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %edx,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x1c(%rbp)
  jg     L83
  mov    -0x4(%rbp),%eax
  jmp    L168
L83:
  cmpl   $0x0,-0x1c(%rbp)
  jle    L167
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L167:
  cmpl   $0x1,-0x1c(%rbp)
  jle    L57
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L57:
  cmpl   $0x2,-0x1c(%rbp)
  jle    L44
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L44:
  cmpl   $0x3,-0x1c(%rbp)
  jle    L111
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L111:
  cmpl   $0x4,-0x1c(%rbp)
  jle    L16
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L16:
  cmpl   $0x5,-0x1c(%rbp)
  jle    L31
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L31:
  cmpl   $0x6,-0x1c(%rbp)
  jle    L122
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L122:
  cmpl   $0x7,-0x1c(%rbp)
  jle    L19
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L19:
  cmpl   $0x8,-0x1c(%rbp)
  jle    L178
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L178:
  cmpl   $0x9,-0x1c(%rbp)
  jle    L164
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x9,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L164:
  cmpl   $0xa,-0x1c(%rbp)
  jle    L171
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xa,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L171:
  cmpl   $0xb,-0x1c(%rbp)
  jle    L2
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xb,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L2:
  cmpl   $0xc,-0x1c(%rbp)
  jle    L159
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L159:
  cmpl   $0xd,-0x1c(%rbp)
  jle    L158
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xd,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L158:
  cmpl   $0xe,-0x1c(%rbp)
  jle    L53
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xe,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L53:
  cmpl   $0xf,-0x1c(%rbp)
  jle    L3
  mov    -0x4(%rbp),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xf,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
L3:
  mov    -0x4(%rbp),%eax
L168:
  pop    %rbp
  ret
```

assistant: ```c
__attribute__((always_)) uint32_t hash_djb2(const char *bytes, const int32_t length, const uint32_t oldhash) {
  uint32_t hash = oldhash;
  if (length <= 0)
    return hash;
  if (length > 0)
    hash = ((hash << 5) + hash) + bytes[0];
  if (length > 1)
    hash = ((hash << 5) + hash) + bytes[1];
  if (length > 2)
    hash = ((hash << 5) + hash) + bytes[2];
  if (length > 3)
    hash = ((hash << 5) + hash) + bytes[3];
  if (length > 4)
    hash = ((hash << 5) + hash) + bytes[4];
  if (length > 5)
    hash = ((hash << 5) + hash) + bytes[5];
  if (length > 6)
    hash = ((hash << 5) + hash) + bytes[6];
  if (length > 7)
    hash = ((hash << 5) + hash) + bytes[7];
  if (length > 8)
    hash = ((hash << 5) + hash) + bytes[8];
  if (length > 9)
    hash = ((hash << 5) + hash) + bytes[9];
  if (length > 10)
    hash = ((hash << 5) + hash) + bytes[10];
  if (length > 11)
    hash = ((hash << 5) + hash) + bytes[11];
  if (length > 12)
    hash = ((hash << 5) + hash) + bytes[12];
  if (length > 13)
    hash = ((hash << 5) + hash) + bytes[13];
  if (length > 14)
    hash = ((hash << 5) + hash) + bytes[14];
  if (length > 15)
    hash = ((hash << 5) + hash) + bytes[15];
  return hash;
}
```