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

```asm
<Update>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  mov    %r8,-0x38(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1c,%rax
  mov    (%rax),%eax
  lea    0x0(,%rax,4),%edx
  mov    -0x18(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%eax
  sar    $0x6,%eax
  xor    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x28,%rax
  mov    (%rax),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2c,%rax
  mov    (%rax),%eax
  sar    $0x3,%eax
  xor    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x8(%rbp),%eax
  xor    -0x4(%rbp),%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x4c,%rax
  mov    (%rax),%eax
  lea    0x0(,%rax,4),%edx
  mov    -0x18(%rbp),%rax
  add    $0x50,%rax
  mov    (%rax),%eax
  sar    $0x6,%eax
  xor    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x54,%rax
  mov    (%rax),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x18(%rbp),%rax
  add    $0x58,%rax
  mov    (%rax),%eax
  sar    $0x7,%eax
  xor    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x8(%rbp),%eax
  xor    -0x4(%rbp),%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x74,%rax
  mov    (%rax),%eax
  lea    0x0(,%rax,8),%edx
  mov    -0x18(%rbp),%rax
  add    $0x78,%rax
  mov    (%rax),%eax
  sar    $0x5,%eax
  xor    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    0x8c(%rax),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x8(%rbp),%eax
  xor    -0x4(%rbp),%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x38(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%ecx
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  xor    %eax,%ecx
  mov    -0x30(%rbp),%rax
  mov    (%rax),%eax
  xor    %ecx,%eax
  xor    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x28,%rax
  mov    (%rax),%eax
  lea    0x0(,%rax,8),%edx
  mov    -0x18(%rbp),%rax
  add    $0x2c,%rax
  mov    (%rax),%eax
  sar    $0x5,%eax
  xor    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x28,%rax
  mov    (%rax),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2c,%rax
  mov    (%rax),%eax
  sar    $0x4,%eax
  xor    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  and    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x50,%rax
  mov    (%rax),%eax
  lea    0x0(,%rax,8),%edx
  mov    -0x18(%rbp),%rax
  add    $0x54,%rax
  mov    (%rax),%eax
  sar    $0x5,%eax
  xor    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x20(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x8(%rbp),%eax
  xor    -0x4(%rbp),%eax
  xor    %eax,%edx
  mov    -0x20(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x50,%rax
  mov    (%rax),%eax
  shl    $0x7,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x54,%rax
  mov    (%rax),%eax
  sar    %eax
  xor    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    0x54(%rax),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  and    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    0x80(%rax),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x8(%rbp),%eax
  xor    -0x4(%rbp),%eax
  xor    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x88,%rax
  mov    (%rax),%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x8c,%rax
  mov    (%rax),%eax
  sar    $0x2,%eax
  xor    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x88,%rax
  mov    (%rax),%eax
  shl    $0x7,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x8c,%rax
  mov    (%rax),%eax
  sar    %eax
  xor    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  and    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1c,%rax
  mov    (%rax),%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%eax
  sar    $0x3,%eax
  xor    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x30(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x8(%rbp),%eax
  xor    -0x4(%rbp),%eax
  xor    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %edx,(%rax)
  nop
  pop    %rbp
  ret
```

assistant: ```c
void Update(uint8_t *state, uint8_t *t1, uint8_t *t2, uint8_t *t3, uint8_t *stream) {
  uint8_t x1, x2;
  x1 = (state[7] << 2) ^ (state[8] >> 6);
  x2 = (state[10] << 5) ^ (state[11] >> 3);
  *t1 = x1 ^ x2;
  x1 = (state[19] << 2) ^ (state[20] >> 6);
  x2 = (state[21] << 1) ^ (state[22] >> 7);
  *t2 = x1 ^ x2;
  x1 = (state[29] << 3) ^ (state[30] >> 5);
  x2 = state[35];
  *t3 = x1 ^ x2;
  *stream ^= *t1 ^ *t2 ^ *t3;
  x1 = (state[10] << 3) ^ (state[11] >> 5);
  x2 = (state[10] << 4) ^ (state[11] >> 4);
  x1 &= x2;
  x2 = (state[20] << 3) ^ (state[21] >> 5);
  *t1 ^= x1 ^ x2;
  x1 = (state[20] << 7) ^ (state[21] >> 1);
  x2 = state[21];
  x1 &= x2;
  x2 = state[32];
  *t2 ^= x1 ^ x2;
  x1 = (state[34] << 6) ^ (state[35] >> 2);
  x2 = (state[34] << 7) ^ (state[35] >> 1);
  x1 &= x2;
  x2 = (state[7] << 5) ^ (state[8] >> 3);
  *t3 ^= x1 ^ x2;
}
```