user: Converte this assembly snippet into its equivalent C code:

```asm
<chi>:
  endbr64
  mov    %rdi,%rax
  movzwl (%rdi),%edx
  movzwl 0x2(%rdi),%edi
  movzwl 0x4(%rax),%r9d
  movzwl 0x6(%rax),%r8d
  mov    %edi,%ecx
  movzwl 0x8(%rax),%esi
  not    %ecx
  and    %r9d,%ecx
  xor    %edx,%ecx
  mov    %cx,(%rax)
  mov    %r9d,%ecx
  not    %ecx
  and    %r8d,%ecx
  xor    %edi,%ecx
  mov    %cx,0x2(%rax)
  mov    %r8d,%ecx
  not    %ecx
  and    %esi,%ecx
  xor    %r9d,%ecx
  movzwl 0xe(%rax),%r9d
  mov    %cx,0x4(%rax)
  mov    %esi,%ecx
  not    %ecx
  and    %edx,%ecx
  not    %edx
  and    %edi,%edx
  movzwl 0xc(%rax),%edi
  xor    %r8d,%ecx
  movzwl 0x10(%rax),%r8d
  xor    %esi,%edx
  mov    %cx,0x6(%rax)
  movzwl 0x12(%rax),%esi
  mov    %edi,%ecx
  mov    %dx,0x8(%rax)
  movzwl 0xa(%rax),%edx
  not    %ecx
  and    %r9d,%ecx
  xor    %edx,%ecx
  mov    %cx,0xa(%rax)
  mov    %r9d,%ecx
  not    %ecx
  and    %r8d,%ecx
  xor    %edi,%ecx
  mov    %cx,0xc(%rax)
  mov    %r8d,%ecx
  not    %ecx
  and    %esi,%ecx
  xor    %r9d,%ecx
  movzwl 0x18(%rax),%r9d
  mov    %cx,0xe(%rax)
  mov    %esi,%ecx
  not    %ecx
  and    %edx,%ecx
  not    %edx
  and    %edi,%edx
  movzwl 0x16(%rax),%edi
  xor    %r8d,%ecx
  movzwl 0x1a(%rax),%r8d
  xor    %esi,%edx
  mov    %cx,0x10(%rax)
  movzwl 0x1c(%rax),%esi
  mov    %edi,%ecx
  mov    %dx,0x12(%rax)
  movzwl 0x14(%rax),%edx
  not    %ecx
  and    %r9d,%ecx
  xor    %edx,%ecx
  mov    %cx,0x14(%rax)
  mov    %r9d,%ecx
  not    %ecx
  and    %r8d,%ecx
  xor    %edi,%ecx
  mov    %cx,0x16(%rax)
  mov    %r8d,%ecx
  not    %ecx
  and    %esi,%ecx
  xor    %r9d,%ecx
  mov    %cx,0x18(%rax)
  mov    %esi,%ecx
  not    %ecx
  and    %edx,%ecx
  not    %edx
  and    %edi,%edx
  movzwl 0x20(%rax),%edi
  xor    %r8d,%ecx
  xor    %esi,%edx
  mov    %cx,0x1a(%rax)
  mov    %dx,0x1c(%rax)
  mov    %edi,%ecx
  movzwl 0x1e(%rax),%edx
  movzwl 0x22(%rax),%r9d
  not    %ecx
  movzwl 0x24(%rax),%r8d
  movzwl 0x26(%rax),%esi
  and    %r9d,%ecx
  xor    %edx,%ecx
  mov    %cx,0x1e(%rax)
  mov    %r9d,%ecx
  not    %ecx
  and    %r8d,%ecx
  xor    %edi,%ecx
  mov    %cx,0x20(%rax)
  mov    %r8d,%ecx
  not    %ecx
  and    %esi,%ecx
  xor    %r9d,%ecx
  movzwl 0x2c(%rax),%r9d
  mov    %cx,0x22(%rax)
  mov    %esi,%ecx
  not    %ecx
  and    %edx,%ecx
  not    %edx
  and    %edi,%edx
  movzwl 0x2a(%rax),%edi
  xor    %r8d,%ecx
  movzwl 0x2e(%rax),%r8d
  xor    %esi,%edx
  mov    %cx,0x24(%rax)
  movzwl 0x30(%rax),%esi
  mov    %edi,%ecx
  mov    %dx,0x26(%rax)
  movzwl 0x28(%rax),%edx
  not    %ecx
  and    %r9d,%ecx
  xor    %edx,%ecx
  mov    %cx,0x28(%rax)
  mov    %r9d,%ecx
  not    %ecx
  and    %r8d,%ecx
  xor    %edi,%ecx
  mov    %cx,0x2a(%rax)
  mov    %r8d,%ecx
  not    %ecx
  and    %esi,%ecx
  xor    %r9d,%ecx
  mov    %cx,0x2c(%rax)
  mov    %esi,%ecx
  not    %ecx
  and    %edx,%ecx
  not    %edx
  and    %edi,%edx
  xor    %r8d,%ecx
  xor    %esi,%edx
  mov    %cx,0x2e(%rax)
  mov    %dx,0x30(%rax)
  ret
```

assistant: ```c
void chi(unsigned short *A) {
  unsigned int x, y;
  unsigned short C[5];
  for (y = 0; y < 5; y++) {
    for (x = 0; x < 5; x++)
      C[x] = A[(((x) % 5) + 5 * ((y) % 5))] ^ ((~A[(((x + 1) % 5) + 5 * ((y) % 5))]) & A[(((x + 2) % 5) + 5 * ((y) % 5))]);
    for (x = 0; x < 5; x++)
      A[(((x) % 5) + 5 * ((y) % 5))] = C[x];
  }
}
```