user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<neoscrypt_salsa>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rax
  mov    %rdi,-0x8(%rsp)
  mov    %esi,-0x4c(%rsp)
  mov    (%rdi),%edi
  mov    %edi,-0x40(%rsp)
  mov    0x4(%rax),%r14d
  mov    %r14d,-0x3c(%rsp)
  mov    0x8(%rax),%ecx
  mov    %ecx,-0x38(%rsp)
  mov    0xc(%rax),%r9d
  mov    %r9d,-0x34(%rsp)
  mov    0x10(%rax),%ebx
  mov    %ebx,-0x30(%rsp)
  mov    0x14(%rax),%r11d
  mov    %r11d,-0x2c(%rsp)
  mov    0x18(%rax),%r15d
  mov    %r15d,-0x28(%rsp)
  mov    0x1c(%rax),%r13d
  mov    %r13d,-0x24(%rsp)
  mov    0x20(%rax),%r10d
  mov    %r10d,-0x20(%rsp)
  mov    0x24(%rax),%ebp
  mov    %ebp,-0x1c(%rsp)
  mov    0x28(%rax),%edx
  mov    %edx,-0x48(%rsp)
  mov    0x2c(%rax),%r8d
  mov    %r8d,-0x44(%rsp)
  mov    0x30(%rax),%edx
  mov    %edx,-0x18(%rsp)
  mov    0x34(%rax),%r8d
  mov    %r8d,-0x14(%rsp)
  mov    0x38(%rax),%r12d
  mov    %r12d,-0x10(%rsp)
  mov    0x3c(%rax),%eax
  mov    %eax,-0xc(%rsp)
  test   %esi,%esi
  je     L19
  mov    %eax,-0x68(%rsp)
  mov    -0x44(%rsp),%esi
  mov    %esi,-0x58(%rsp)
  mov    -0x48(%rsp),%eax
  mov    %r13d,-0x5c(%rsp)
  mov    %r9d,-0x60(%rsp)
  mov    %ecx,-0x64(%rsp)
  mov    %edi,%esi
  mov    %ebx,%r9d
  mov    %ebp,%edi
  mov    %edx,%ebp
  mov    %eax,%edx
  mov    %r12d,%r13d
  mov    -0x68(%rsp),%eax
L17:
  lea    (%rsi,%rbp,1),%ecx
  mov    %ecx,%ebx
  shl    $0x7,%ebx
  sar    $0x19,%ecx
  or     %ecx,%ebx
  xor    %r9d,%ebx
  lea    (%rbx,%rsi,1),%ecx
  mov    %ecx,%r9d
  shl    $0x9,%r9d
  sar    $0x17,%ecx
  or     %ecx,%r9d
  xor    %r10d,%r9d
  mov    %r9d,%r10d
  lea    (%rbx,%r9,1),%ecx
  mov    %ecx,%r9d
  shl    $0xd,%r9d
  sar    $0x13,%ecx
  or     %ecx,%r9d
  xor    %ebp,%r9d
  mov    %r10d,-0x54(%rsp)
  mov    %r10d,%ecx
  mov    %r9d,-0x68(%rsp)
  add    %r9d,%ecx
  mov    %ecx,%r9d
  shl    $0x12,%r9d
  sar    $0xe,%ecx
  or     %ecx,%r9d
  xor    %esi,%r9d
  lea    (%r14,%r11,1),%ecx
  mov    %ecx,%ebp
  shl    $0x7,%ebp
  sar    $0x19,%ecx
  or     %ecx,%ebp
  xor    %edi,%ebp
  lea    0x0(%rbp,%r11,1),%ecx
  mov    %ecx,%esi
  shl    $0x9,%esi
  sar    $0x17,%ecx
  or     %ecx,%esi
  xor    %r8d,%esi
  mov    %esi,%edi
  lea    0x0(%rbp,%rsi,1),%ecx
  mov    %ecx,%esi
  shl    $0xd,%esi
  sar    $0x13,%ecx
  or     %ecx,%esi
  xor    %esi,%r14d
  mov    %edi,-0x50(%rsp)
  lea    (%rdi,%r14,1),%ecx
  mov    %ecx,%esi
  shl    $0x12,%esi
  mov    %esi,%edi
  sar    $0xe,%ecx
  or     %ecx,%edi
  xor    %r11d,%edi
  lea    (%r15,%rdx,1),%ecx
  mov    %ecx,%r12d
  shl    $0x7,%r12d
  sar    $0x19,%ecx
  or     %ecx,%r12d
  xor    %r13d,%r12d
  lea    (%r12,%rdx,1),%ecx
  mov    %ecx,%esi
  shl    $0x9,%esi
  sar    $0x17,%ecx
  or     %ecx,%esi
  xor    -0x64(%rsp),%esi
  lea    (%r12,%rsi,1),%ecx
  mov    %ecx,%r11d
  shl    $0xd,%r11d
  sar    $0x13,%ecx
  or     %ecx,%r11d
  xor    %r15d,%r11d
  lea    (%rsi,%r11,1),%ecx
  mov    %ecx,%r8d
  shl    $0x12,%r8d
  sar    $0xe,%ecx
  or     %ecx,%r8d
  xor    %r8d,%edx
  mov    -0x58(%rsp),%r15d
  lea    (%r15,%rax,1),%ecx
  mov    %ecx,%r13d
  shl    $0x7,%r13d
  sar    $0x19,%ecx
  or     %ecx,%r13d
  xor    -0x60(%rsp),%r13d
  lea    0x0(%r13,%rax,1),%ecx
  mov    %ecx,%r8d
  shl    $0x9,%r8d
  sar    $0x17,%ecx
  or     %ecx,%r8d
  xor    -0x5c(%rsp),%r8d
  lea    0x0(%r13,%r8,1),%ecx
  mov    %ecx,%r10d
  shl    $0xd,%r10d
  sar    $0x13,%ecx
  or     %ecx,%r10d
  xor    %r15d,%r10d
  lea    (%r8,%r10,1),%r15d
  mov    %r15d,%ecx
  shl    $0x12,%ecx
  sar    $0xe,%r15d
  or     %r15d,%ecx
  xor    %eax,%ecx
  lea    (%r9,%r13,1),%eax
  mov    %eax,%r15d
  shl    $0x7,%r15d
  sar    $0x19,%eax
  or     %eax,%r15d
  xor    %r15d,%r14d
  lea    (%r9,%r14,1),%eax
  mov    %eax,%r15d
  shl    $0x9,%r15d
  sar    $0x17,%eax
  or     %eax,%r15d
  xor    %esi,%r15d
  mov    %r15d,-0x64(%rsp)
  lea    (%r14,%r15,1),%eax
  mov    %eax,%esi
  shl    $0xd,%esi
  sar    $0x13,%eax
  or     %eax,%esi
  xor    %r13d,%esi
  mov    %esi,-0x60(%rsp)
  mov    %r15d,%eax
  add    %esi,%eax
  mov    %eax,%esi
  shl    $0x12,%esi
  sar    $0xe,%eax
  or     %eax,%esi
  xor    %r9d,%esi
  lea    (%rbx,%rdi,1),%eax
  mov    %eax,%r15d
  shl    $0x7,%r15d
  sar    $0x19,%eax
  or     %eax,%r15d
  xor    %r11d,%r15d
  lea    (%rdi,%r15,1),%eax
  mov    %eax,%r11d
  shl    $0x9,%r11d
  mov    %r11d,%r9d
  sar    $0x17,%eax
  or     %eax,%r9d
  xor    %r8d,%r9d
  mov    %r9d,%r11d
  mov    %r9d,-0x5c(%rsp)
  lea    (%r15,%r9,1),%eax
  mov    %eax,%r8d
  shl    $0xd,%r8d
  mov    %r8d,%r9d
  sar    $0x13,%eax
  or     %eax,%r9d
  xor    %ebx,%r9d
  lea    (%r11,%r9,1),%eax
  mov    %eax,%r11d
  shl    $0x12,%r11d
  sar    $0xe,%eax
  or     %eax,%r11d
  xor    %edi,%r11d
  lea    0x0(%rbp,%rdx,1),%eax
  mov    %eax,%ebx
  shl    $0x7,%ebx
  mov    %ebx,%edi
  sar    $0x19,%eax
  or     %eax,%edi
  mov    %edi,%ebx
  xor    %r10d,%ebx
  mov    %ebx,-0x58(%rsp)
  lea    (%rdx,%rbx,1),%eax
  mov    %eax,%r10d
  shl    $0x9,%r10d
  sar    $0x17,%eax
  or     %eax,%r10d
  xor    -0x54(%rsp),%r10d
  lea    (%rbx,%r10,1),%eax
  mov    %eax,%ebx
  shl    $0xd,%ebx
  mov    %ebx,%edi
  sar    $0x13,%eax
  or     %eax,%edi
  xor    %ebp,%edi
  lea    (%r10,%rdi,1),%eax
  mov    %eax,%r8d
  shl    $0x12,%r8d
  sar    $0xe,%eax
  or     %eax,%r8d
  xor    %r8d,%edx
  lea    (%r12,%rcx,1),%eax
  mov    %eax,%ebp
  shl    $0x7,%ebp
  sar    $0x19,%eax
  or     %eax,%ebp
  xor    -0x68(%rsp),%ebp
  lea    (%rcx,%rbp,1),%eax
  mov    %eax,%r8d
  shl    $0x9,%r8d
  sar    $0x17,%eax
  or     %eax,%r8d
  xor    -0x50(%rsp),%r8d
  lea    0x0(%rbp,%r8,1),%eax
  mov    %eax,%r13d
  shl    $0xd,%r13d
  sar    $0x13,%eax
  or     %eax,%r13d
  xor    %r12d,%r13d
  lea    (%r8,%r13,1),%ebx
  mov    %ebx,%eax
  shl    $0x12,%eax
  sar    $0xe,%ebx
  or     %ebx,%eax
  xor    %ecx,%eax
  subl   $0x2,-0x4c(%rsp)
  jne    L17
  mov    %r9d,%ebx
  mov    %edx,%ecx
  mov    %ebp,%edx
  mov    %edi,%ebp
  mov    %r13d,%r12d
  mov    %eax,-0x68(%rsp)
L1:
  mov    -0x40(%rsp),%eax
  add    %esi,%eax
  mov    -0x8(%rsp),%rdi
  mov    %eax,(%rdi)
  mov    -0x3c(%rsp),%eax
  add    %r14d,%eax
  mov    %eax,0x4(%rdi)
  mov    -0x38(%rsp),%eax
  add    -0x64(%rsp),%eax
  mov    %eax,0x8(%rdi)
  mov    -0x34(%rsp),%eax
  add    -0x60(%rsp),%eax
  mov    %eax,0xc(%rdi)
  mov    -0x30(%rsp),%eax
  add    %ebx,%eax
  mov    %eax,0x10(%rdi)
  mov    -0x2c(%rsp),%eax
  add    %r11d,%eax
  mov    %eax,0x14(%rdi)
  mov    -0x28(%rsp),%eax
  add    %r15d,%eax
  mov    %eax,0x18(%rdi)
  mov    -0x24(%rsp),%eax
  add    -0x5c(%rsp),%eax
  mov    %eax,0x1c(%rdi)
  mov    -0x20(%rsp),%eax
  add    %r10d,%eax
  mov    %eax,0x20(%rdi)
  mov    -0x1c(%rsp),%eax
  add    %ebp,%eax
  mov    %eax,0x24(%rdi)
  mov    -0x48(%rsp),%eax
  add    %ecx,%eax
  mov    %eax,0x28(%rdi)
  mov    -0x44(%rsp),%eax
  add    -0x58(%rsp),%eax
  mov    %eax,0x2c(%rdi)
  mov    -0x18(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x30(%rdi)
  mov    -0x14(%rsp),%eax
  add    %r8d,%eax
  mov    %eax,0x34(%rdi)
  mov    -0x10(%rsp),%eax
  add    %r12d,%eax
  mov    %eax,0x38(%rdi)
  mov    -0xc(%rsp),%eax
  add    -0x68(%rsp),%eax
  mov    %eax,0x3c(%rdi)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L19:
  mov    -0xc(%rsp),%eax
  mov    %eax,-0x68(%rsp)
  mov    -0x10(%rsp),%r12d
  mov    -0x14(%rsp),%r8d
  mov    -0x18(%rsp),%edx
  mov    -0x44(%rsp),%eax
  mov    %eax,-0x58(%rsp)
  mov    -0x48(%rsp),%eax
  mov    %eax,%ecx
  mov    -0x1c(%rsp),%ebp
  mov    -0x20(%rsp),%r10d
  mov    -0x24(%rsp),%eax
  mov    %eax,-0x5c(%rsp)
  mov    -0x28(%rsp),%r15d
  mov    -0x2c(%rsp),%r11d
  mov    -0x30(%rsp),%ebx
  mov    -0x34(%rsp),%eax
  mov    %eax,-0x60(%rsp)
  mov    -0x38(%rsp),%eax
  mov    %eax,-0x64(%rsp)
  mov    -0x3c(%rsp),%r14d
  mov    -0x40(%rsp),%esi
  jmp    L1
```

assistant: ```c
void neoscrypt_salsa(uint *X, uint rounds) {
  uint x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, t;
  x0 = X[0];
  x1 = X[1];
  x2 = X[2];
  x3 = X[3];
  x4 = X[4];
  x5 = X[5];
  x6 = X[6];
  x7 = X[7];
  x8 = X[8];
  x9 = X[9];
  x10 = X[10];
  x11 = X[11];
  x12 = X[12];
  x13 = X[13];
  x14 = X[14];
  x15 = X[15];
  for (; rounds; rounds -= 2) {
    t = x0 + x12;
    t = (((t) << (7)) | ((t) >> (32 - 7)));
    x4 ^= t;
    t = x4 + x0;
    t = (((t) << (9)) | ((t) >> (32 - 9)));
    x8 ^= t;
    t = x8 + x4;
    t = (((t) << (13)) | ((t) >> (32 - 13)));
    x12 ^= t;
    t = x12 + x8;
    t = (((t) << (18)) | ((t) >> (32 - 18)));
    x0 ^= t;
    ;
    t = x5 + x1;
    t = (((t) << (7)) | ((t) >> (32 - 7)));
    x9 ^= t;
    t = x9 + x5;
    t = (((t) << (9)) | ((t) >> (32 - 9)));
    x13 ^= t;
    t = x13 + x9;
    t = (((t) << (13)) | ((t) >> (32 - 13)));
    x1 ^= t;
    t = x1 + x13;
    t = (((t) << (18)) | ((t) >> (32 - 18)));
    x5 ^= t;
    ;
    t = x10 + x6;
    t = (((t) << (7)) | ((t) >> (32 - 7)));
    x14 ^= t;
    t = x14 + x10;
    t = (((t) << (9)) | ((t) >> (32 - 9)));
    x2 ^= t;
    t = x2 + x14;
    t = (((t) << (13)) | ((t) >> (32 - 13)));
    x6 ^= t;
    t = x6 + x2;
    t = (((t) << (18)) | ((t) >> (32 - 18)));
    x10 ^= t;
    ;
    t = x15 + x11;
    t = (((t) << (7)) | ((t) >> (32 - 7)));
    x3 ^= t;
    t = x3 + x15;
    t = (((t) << (9)) | ((t) >> (32 - 9)));
    x7 ^= t;
    t = x7 + x3;
    t = (((t) << (13)) | ((t) >> (32 - 13)));
    x11 ^= t;
    t = x11 + x7;
    t = (((t) << (18)) | ((t) >> (32 - 18)));
    x15 ^= t;
    ;
    t = x0 + x3;
    t = (((t) << (7)) | ((t) >> (32 - 7)));
    x1 ^= t;
    t = x1 + x0;
    t = (((t) << (9)) | ((t) >> (32 - 9)));
    x2 ^= t;
    t = x2 + x1;
    t = (((t) << (13)) | ((t) >> (32 - 13)));
    x3 ^= t;
    t = x3 + x2;
    t = (((t) << (18)) | ((t) >> (32 - 18)));
    x0 ^= t;
    ;
    t = x5 + x4;
    t = (((t) << (7)) | ((t) >> (32 - 7)));
    x6 ^= t;
    t = x6 + x5;
    t = (((t) << (9)) | ((t) >> (32 - 9)));
    x7 ^= t;
    t = x7 + x6;
    t = (((t) << (13)) | ((t) >> (32 - 13)));
    x4 ^= t;
    t = x4 + x7;
    t = (((t) << (18)) | ((t) >> (32 - 18)));
    x5 ^= t;
    ;
    t = x10 + x9;
    t = (((t) << (7)) | ((t) >> (32 - 7)));
    x11 ^= t;
    t = x11 + x10;
    t = (((t) << (9)) | ((t) >> (32 - 9)));
    x8 ^= t;
    t = x8 + x11;
    t = (((t) << (13)) | ((t) >> (32 - 13)));
    x9 ^= t;
    t = x9 + x8;
    t = (((t) << (18)) | ((t) >> (32 - 18)));
    x10 ^= t;
    ;
    t = x15 + x14;
    t = (((t) << (7)) | ((t) >> (32 - 7)));
    x12 ^= t;
    t = x12 + x15;
    t = (((t) << (9)) | ((t) >> (32 - 9)));
    x13 ^= t;
    t = x13 + x12;
    t = (((t) << (13)) | ((t) >> (32 - 13)));
    x14 ^= t;
    t = x14 + x13;
    t = (((t) << (18)) | ((t) >> (32 - 18)));
    x15 ^= t;
    ;
  }
  X[0] += x0;
  X[1] += x1;
  X[2] += x2;
  X[3] += x3;
  X[4] += x4;
  X[5] += x5;
  X[6] += x6;
  X[7] += x7;
  X[8] += x8;
  X[9] += x9;
  X[10] += x10;
  X[11] += x11;
  X[12] += x12;
  X[13] += x13;
  X[14] += x14;
  X[15] += x15;
}
```