user: Please show me the C implementation that matches the assembly code listed below:

```asm
<siphash>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %edx,-0x44(%rbp)
  mov    %rcx,-0x50(%rbp)
  movl   $0x70736575,-0x30(%rbp)
  movl   $0x6e646f6d,-0x2c(%rbp)
  movl   $0x6e657261,-0x28(%rbp)
  movl   $0x79746573,-0x24(%rbp)
  mov    -0x50(%rbp),%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%rax
  mov    %eax,%esi
  mov    $0x20,%eax
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x28,%rax
  mov    (%rax),%rax
  mov    %eax,%esi
  mov    $0x28,%eax
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x30,%rax
  mov    (%rax),%rax
  mov    %eax,%esi
  mov    $0x30,%eax
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x38,%rax
  mov    (%rax),%rax
  mov    %eax,%esi
  mov    $0x38,%eax
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %edx,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x50(%rbp),%rax
  add    $0x40,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x48,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x50,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x58,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x60,%rax
  mov    (%rax),%rax
  mov    %eax,%esi
  mov    $0x20,%eax
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x68,%rax
  mov    (%rax),%rax
  mov    %eax,%esi
  mov    $0x28,%eax
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x70,%rax
  mov    (%rax),%rax
  mov    %eax,%esi
  mov    $0x30,%eax
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %eax,%edx
  mov    -0x50(%rbp),%rax
  add    $0x78,%rax
  mov    (%rax),%rax
  mov    %eax,%esi
  mov    $0x38,%eax
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x44(%rbp),%eax
  cltq
  and    $0xfffffffffffffffc,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x44(%rbp),%eax
  and    $0x7,%eax
  mov    %eax,-0x10(%rbp)
  mov    $0x38,%edx
  mov    -0x44(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x14(%rbp),%eax
  xor    %eax,-0x24(%rbp)
  mov    -0x18(%rbp),%eax
  xor    %eax,-0x28(%rbp)
  mov    -0x14(%rbp),%eax
  xor    %eax,-0x2c(%rbp)
  mov    -0x18(%rbp),%eax
  xor    %eax,-0x30(%rbp)
  jmp    L49
L5:
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    -0x40(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x40(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x40(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %eax,%edx
  mov    -0x40(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%rax
  mov    %eax,%esi
  mov    $0x20,%eax
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %eax,%edx
  mov    -0x40(%rbp),%rax
  add    $0x28,%rax
  mov    (%rax),%rax
  mov    %eax,%esi
  mov    $0x28,%eax
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %eax,%edx
  mov    -0x40(%rbp),%rax
  add    $0x30,%rax
  mov    (%rax),%rax
  mov    %eax,%esi
  mov    $0x30,%eax
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %eax,%edx
  mov    -0x40(%rbp),%rax
  add    $0x38,%rax
  mov    (%rax),%rax
  mov    %eax,%esi
  mov    $0x38,%eax
  mov    %eax,%ecx
  shl    %cl,%esi
  mov    %esi,%eax
  or     %edx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  xor    %eax,-0x24(%rbp)
  movl   $0x0,-0x1c(%rbp)
  jmp    L29
L3:
  mov    -0x2c(%rbp),%eax
  add    %eax,-0x30(%rbp)
  mov    -0x2c(%rbp),%eax
  shl    $0xd,%eax
  mov    %eax,%esi
  mov    $0x33,%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x30(%rbp),%eax
  xor    %eax,-0x2c(%rbp)
  mov    $0x20,%edx
  mov    -0x30(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%esi
  mov    $0x20,%edx
  mov    -0x30(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,-0x28(%rbp)
  mov    -0x24(%rbp),%eax
  shl    $0x10,%eax
  mov    %eax,%esi
  mov    $0x30,%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x28(%rbp),%eax
  xor    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,-0x30(%rbp)
  mov    -0x24(%rbp),%eax
  shl    $0x15,%eax
  mov    %eax,%esi
  mov    $0x2b,%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x30(%rbp),%eax
  xor    %eax,-0x24(%rbp)
  mov    -0x2c(%rbp),%eax
  add    %eax,-0x28(%rbp)
  mov    -0x2c(%rbp),%eax
  shl    $0x11,%eax
  mov    %eax,%esi
  mov    $0x2f,%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x28(%rbp),%eax
  xor    %eax,-0x2c(%rbp)
  mov    $0x20,%edx
  mov    -0x28(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%esi
  mov    $0x20,%edx
  mov    -0x28(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x28(%rbp)
  addl   $0x1,-0x1c(%rbp)
L29:
  cmpl   $0x1,-0x1c(%rbp)
  jle    L3
  mov    -0xc(%rbp),%eax
  xor    %eax,-0x30(%rbp)
  addq   $0x40,-0x40(%rbp)
L49:
  mov    -0x40(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jne    L5
  cmpl   $0x7,-0x10(%rbp)
  ja     L19
  mov    -0x10(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D16(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D16(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x40(%rbp),%rax
  add    $0x30,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    $0x30,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  or     %eax,-0x20(%rbp)
  mov    -0x40(%rbp),%rax
  add    $0x28,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    $0x28,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  or     %eax,-0x20(%rbp)
  mov    -0x40(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%rax
  mov    %eax,%edx
  mov    $0x20,%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  or     %eax,-0x20(%rbp)
  mov    -0x40(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  shl    $0x18,%eax
  or     %eax,-0x20(%rbp)
  mov    -0x40(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  shl    $0x10,%eax
  or     %eax,-0x20(%rbp)
  mov    -0x40(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  shl    $0x8,%eax
  or     %eax,-0x20(%rbp)
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rax
  or     %eax,-0x20(%rbp)
  jmp    L19
  nop
L19:
  mov    -0x20(%rbp),%eax
  xor    %eax,-0x24(%rbp)
  movl   $0x0,-0x1c(%rbp)
  jmp    L13
L33:
  mov    -0x2c(%rbp),%eax
  add    %eax,-0x30(%rbp)
  mov    -0x2c(%rbp),%eax
  shl    $0xd,%eax
  mov    %eax,%esi
  mov    $0x33,%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x30(%rbp),%eax
  xor    %eax,-0x2c(%rbp)
  mov    $0x20,%edx
  mov    -0x30(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%esi
  mov    $0x20,%edx
  mov    -0x30(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,-0x28(%rbp)
  mov    -0x24(%rbp),%eax
  shl    $0x10,%eax
  mov    %eax,%esi
  mov    $0x30,%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x28(%rbp),%eax
  xor    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,-0x30(%rbp)
  mov    -0x24(%rbp),%eax
  shl    $0x15,%eax
  mov    %eax,%esi
  mov    $0x2b,%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x30(%rbp),%eax
  xor    %eax,-0x24(%rbp)
  mov    -0x2c(%rbp),%eax
  add    %eax,-0x28(%rbp)
  mov    -0x2c(%rbp),%eax
  shl    $0x11,%eax
  mov    %eax,%esi
  mov    $0x2f,%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x28(%rbp),%eax
  xor    %eax,-0x2c(%rbp)
  mov    $0x20,%edx
  mov    -0x28(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%esi
  mov    $0x20,%edx
  mov    -0x28(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x28(%rbp)
  addl   $0x1,-0x1c(%rbp)
L13:
  cmpl   $0x1,-0x1c(%rbp)
  jle    L33
  mov    -0x20(%rbp),%eax
  xor    %eax,-0x30(%rbp)
  xorl   $0xff,-0x28(%rbp)
  movl   $0x0,-0x1c(%rbp)
  jmp    L83
L63:
  mov    -0x2c(%rbp),%eax
  add    %eax,-0x30(%rbp)
  mov    -0x2c(%rbp),%eax
  shl    $0xd,%eax
  mov    %eax,%esi
  mov    $0x33,%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x30(%rbp),%eax
  xor    %eax,-0x2c(%rbp)
  mov    $0x20,%edx
  mov    -0x30(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%esi
  mov    $0x20,%edx
  mov    -0x30(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,-0x28(%rbp)
  mov    -0x24(%rbp),%eax
  shl    $0x10,%eax
  mov    %eax,%esi
  mov    $0x30,%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x28(%rbp),%eax
  xor    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  add    %eax,-0x30(%rbp)
  mov    -0x24(%rbp),%eax
  shl    $0x15,%eax
  mov    %eax,%esi
  mov    $0x2b,%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x30(%rbp),%eax
  xor    %eax,-0x24(%rbp)
  mov    -0x2c(%rbp),%eax
  add    %eax,-0x28(%rbp)
  mov    -0x2c(%rbp),%eax
  shl    $0x11,%eax
  mov    %eax,%esi
  mov    $0x2f,%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x28(%rbp),%eax
  xor    %eax,-0x2c(%rbp)
  mov    $0x20,%edx
  mov    -0x28(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%esi
  mov    $0x20,%edx
  mov    -0x28(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x28(%rbp)
  addl   $0x1,-0x1c(%rbp)
L83:
  cmpl   $0x3,-0x1c(%rbp)
  jle    L63
  mov    -0x30(%rbp),%eax
  xor    -0x2c(%rbp),%eax
  xor    -0x28(%rbp),%eax
  xor    -0x24(%rbp),%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x20(%rbp),%eax
  sar    $0x8,%eax
  mov    %eax,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  movslq %ecx,%rax
  mov    %rax,(%rdx)
  mov    -0x20(%rbp),%eax
  sar    $0x10,%eax
  mov    %eax,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x10(%rax),%rdx
  movslq %ecx,%rax
  mov    %rax,(%rdx)
  mov    -0x20(%rbp),%eax
  sar    $0x18,%eax
  mov    %eax,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x18(%rax),%rdx
  movslq %ecx,%rax
  mov    %rax,(%rdx)
  mov    $0x20,%edx
  mov    -0x20(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  mov    %eax,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x20(%rax),%rdx
  movslq %ecx,%rax
  mov    %rax,(%rdx)
  mov    $0x20,%edx
  mov    -0x20(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  sar    $0x8,%eax
  mov    %eax,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x28(%rax),%rdx
  movslq %ecx,%rax
  mov    %rax,(%rdx)
  mov    $0x20,%edx
  mov    -0x20(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  sar    $0x10,%eax
  mov    %eax,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x30(%rax),%rdx
  movslq %ecx,%rax
  mov    %rax,(%rdx)
  mov    $0x20,%edx
  mov    -0x20(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  sar    $0x18,%eax
  mov    %eax,%ecx
  mov    -0x38(%rbp),%rax
  lea    0x38(%rax),%rdx
  movslq %ecx,%rax
  mov    %rax,(%rdx)
  mov    $0x0,%eax
  pop    %rbp
  ret
```

assistant: ```c
int siphash(uint8_t *out, const uint8_t *in, uint64_t inlen, const uint8_t *k) {
  uint64_t v0 = 0x736f6d6570736575ULL;
  uint64_t v1 = 0x646f72616e646f6dULL;
  uint64_t v2 = 0x6c7967656e657261ULL;
  uint64_t v3 = 0x7465646279746573ULL;
  uint64_t b;
  uint64_t k0 = (((uint64_t)((k)[0])) | ((uint64_t)((k)[1]) << 8) | ((uint64_t)((k)[2]) << 16) | ((uint64_t)((k)[3]) << 24) | ((uint64_t)((k)[4]) << 32) | ((uint64_t)((k)[5]) << 40) | ((uint64_t)((k)[6]) << 48) | ((uint64_t)((k)[7]) << 56));
  uint64_t k1 = (((uint64_t)((k + 8)[0])) | ((uint64_t)((k + 8)[1]) << 8) | ((uint64_t)((k + 8)[2]) << 16) | ((uint64_t)((k + 8)[3]) << 24) | ((uint64_t)((k + 8)[4]) << 32) | ((uint64_t)((k + 8)[5]) << 40) | ((uint64_t)((k + 8)[6]) << 48) | ((uint64_t)((k + 8)[7]) << 56));
  uint64_t m;
  int i;
  const uint8_t *end = in + inlen - (inlen % sizeof(uint64_t));
  const int left = inlen & 7;
  b = ((uint64_t)inlen) << 56;
  v3 ^= k1;
  v2 ^= k0;
  v1 ^= k1;
  v0 ^= k0;
  for (; in != end; in += 8) {
    m = (((uint64_t)((in)[0])) | ((uint64_t)((in)[1]) << 8) | ((uint64_t)((in)[2]) << 16) | ((uint64_t)((in)[3]) << 24) | ((uint64_t)((in)[4]) << 32) | ((uint64_t)((in)[5]) << 40) | ((uint64_t)((in)[6]) << 48) | ((uint64_t)((in)[7]) << 56));
    v3 ^= m;
    ;
    for (i = 0; i < 2; ++i)
      do {
        v0 += v1;
        v1 = (uint64_t)(((v1) << (13)) | ((v1) >> (64 - (13))));
        v1 ^= v0;
        v0 = (uint64_t)(((v0) << (32)) | ((v0) >> (64 - (32))));
        v2 += v3;
        v3 = (uint64_t)(((v3) << (16)) | ((v3) >> (64 - (16))));
        v3 ^= v2;
        v0 += v3;
        v3 = (uint64_t)(((v3) << (21)) | ((v3) >> (64 - (21))));
        v3 ^= v0;
        v2 += v1;
        v1 = (uint64_t)(((v1) << (17)) | ((v1) >> (64 - (17))));
        v1 ^= v2;
        v2 = (uint64_t)(((v2) << (32)) | ((v2) >> (64 - (32))));
      } while (0);
    v0 ^= m;
  }
  switch (left) {
  case 7:
    b |= ((uint64_t)in[6]) << 48;
  case 6:
    b |= ((uint64_t)in[5]) << 40;
  case 5:
    b |= ((uint64_t)in[4]) << 32;
  case 4:
    b |= ((uint64_t)in[3]) << 24;
  case 3:
    b |= ((uint64_t)in[2]) << 16;
  case 2:
    b |= ((uint64_t)in[1]) << 8;
  case 1:
    b |= ((uint64_t)in[0]);
    break;
  case 0:
    break;
  }
  v3 ^= b;
  ;
  for (i = 0; i < 2; ++i)
    do {
      v0 += v1;
      v1 = (uint64_t)(((v1) << (13)) | ((v1) >> (64 - (13))));
      v1 ^= v0;
      v0 = (uint64_t)(((v0) << (32)) | ((v0) >> (64 - (32))));
      v2 += v3;
      v3 = (uint64_t)(((v3) << (16)) | ((v3) >> (64 - (16))));
      v3 ^= v2;
      v0 += v3;
      v3 = (uint64_t)(((v3) << (21)) | ((v3) >> (64 - (21))));
      v3 ^= v0;
      v2 += v1;
      v1 = (uint64_t)(((v1) << (17)) | ((v1) >> (64 - (17))));
      v1 ^= v2;
      v2 = (uint64_t)(((v2) << (32)) | ((v2) >> (64 - (32))));
    } while (0);
  v0 ^= b;
  v2 ^= 0xff;
  ;
  for (i = 0; i < 4; ++i)
    do {
      v0 += v1;
      v1 = (uint64_t)(((v1) << (13)) | ((v1) >> (64 - (13))));
      v1 ^= v0;
      v0 = (uint64_t)(((v0) << (32)) | ((v0) >> (64 - (32))));
      v2 += v3;
      v3 = (uint64_t)(((v3) << (16)) | ((v3) >> (64 - (16))));
      v3 ^= v2;
      v0 += v3;
      v3 = (uint64_t)(((v3) << (21)) | ((v3) >> (64 - (21))));
      v3 ^= v0;
      v2 += v1;
      v1 = (uint64_t)(((v1) << (17)) | ((v1) >> (64 - (17))));
      v1 ^= v2;
      v2 = (uint64_t)(((v2) << (32)) | ((v2) >> (64 - (32))));
    } while (0);
  b = v0 ^ v1 ^ v2 ^ v3;
  ((out))[0] = (uint8_t)(((uint32_t)((b))));
  ((out))[1] = (uint8_t)(((uint32_t)((b))) >> 8);
  ((out))[2] = (uint8_t)(((uint32_t)((b))) >> 16);
  ((out))[3] = (uint8_t)(((uint32_t)((b))) >> 24);
  ;
  ((out) + 4)[0] = (uint8_t)(((uint32_t)((b) >> 32)));
  ((out) + 4)[1] = (uint8_t)(((uint32_t)((b) >> 32)) >> 8);
  ((out) + 4)[2] = (uint8_t)(((uint32_t)((b) >> 32)) >> 16);
  ((out) + 4)[3] = (uint8_t)(((uint32_t)((b) >> 32)) >> 24);
  ;
  ;
  return 0;
}
```