user: 请将以下的汇编代码转换成C语言代码：

```asm
<half_round>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0xc(%rbp),%eax
  add    %eax,-0x10(%rbp)
  mov    -0x4(%rbp),%eax
  add    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0xd,%eax
  mov    %eax,%esi
  mov    $0x33,%edx
  mov    -0xc(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  xor    -0x10(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x10,%eax
  mov    %eax,%esi
  mov    $0x30,%edx
  mov    -0x4(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  xor    -0x8(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  mov    $0x20,%edx
  mov    -0x10(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%esi
  mov    $0x20,%edx
  mov    -0x10(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0xc(%rbp),%eax
  add    %eax,-0x8(%rbp)
  mov    -0x4(%rbp),%eax
  add    %eax,-0x10(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x11,%eax
  mov    %eax,%esi
  mov    $0x2f,%edx
  mov    -0xc(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  xor    -0x8(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x15,%eax
  mov    %eax,%esi
  mov    $0x2b,%edx
  mov    -0x4(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  xor    -0x10(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  mov    $0x20,%edx
  mov    -0x8(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%esi
  mov    $0x20,%edx
  mov    -0x8(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  add    %eax,-0x10(%rbp)
  mov    -0x4(%rbp),%eax
  add    %eax,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0xd,%eax
  mov    %eax,%esi
  mov    $0x33,%edx
  mov    -0xc(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  xor    -0x10(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x10,%eax
  mov    %eax,%esi
  mov    $0x30,%edx
  mov    -0x4(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  xor    -0x8(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  mov    $0x20,%edx
  mov    -0x10(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%esi
  mov    $0x20,%edx
  mov    -0x10(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0xc(%rbp),%eax
  add    %eax,-0x8(%rbp)
  mov    -0x4(%rbp),%eax
  add    %eax,-0x10(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x11,%eax
  mov    %eax,%esi
  mov    $0x2f,%edx
  mov    -0xc(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  xor    -0x8(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x15,%eax
  mov    %eax,%esi
  mov    $0x2b,%edx
  mov    -0x4(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  xor    -0x10(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  mov    $0x20,%edx
  mov    -0x8(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  mov    %eax,%esi
  mov    $0x20,%edx
  mov    -0x8(%rbp),%eax
  mov    %edx,%ecx
  sar    %cl,%eax
  or     %esi,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x20(%rbp),%rax
  mov    -0x10(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x20(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    -0xc(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x20(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0x8(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x20(%rbp),%rax
  lea    0xc(%rax),%rdx
  mov    -0x4(%rbp),%eax
  mov    %eax,(%rdx)
  nop
  pop    %rbp
  ret
```

assistant: ```c
void half_round(const uint64_t in[4], uint64_t out[4]) {
  uint64_t a, b, c, d;
  a = in[0];
  b = in[1];
  c = in[2];
  d = in[3];
  a += b;
  c += d;
  b = (uint64_t)(((b) << (13)) | ((b) >> (64 - (13)))) ^ a;
  d = (uint64_t)(((d) << (16)) | ((d) >> (64 - (16)))) ^ c;
  a = (uint64_t)(((a) << (32)) | ((a) >> (64 - (32))));
  ;
  c += b;
  a += d;
  b = (uint64_t)(((b) << (17)) | ((b) >> (64 - (17)))) ^ c;
  d = (uint64_t)(((d) << (21)) | ((d) >> (64 - (21)))) ^ a;
  c = (uint64_t)(((c) << (32)) | ((c) >> (64 - (32))));
  ;
  a += b;
  c += d;
  b = (uint64_t)(((b) << (13)) | ((b) >> (64 - (13)))) ^ a;
  d = (uint64_t)(((d) << (16)) | ((d) >> (64 - (16)))) ^ c;
  a = (uint64_t)(((a) << (32)) | ((a) >> (64 - (32))));
  ;
  c += b;
  a += d;
  b = (uint64_t)(((b) << (17)) | ((b) >> (64 - (17)))) ^ c;
  d = (uint64_t)(((d) << (21)) | ((d) >> (64 - (21)))) ^ a;
  c = (uint64_t)(((c) << (32)) | ((c) >> (64 - (32))));
  ;
  out[0] = a;
  out[1] = b;
  out[2] = c;
  out[3] = d;
}
```