user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<neoscrypt_chacha>:
  endbr64
  push   %r15
  push   %r14
  mov    %rdi,%r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    0x18(%rdi),%eax
  mov    0x2c(%r14),%edx
  mov    (%rdi),%r13d
  mov    0x4(%rdi),%r11d
  mov    0x8(%rdi),%r10d
  mov    0xc(%rdi),%r8d
  mov    0x10(%rdi),%ebp
  mov    %rdi,-0x8(%rsp)
  mov    0x14(%rdi),%ebx
  mov    0x1c(%rdi),%r15d
  mov    %eax,-0x48(%rsp)
  mov    0x20(%rdi),%r9d
  mov    0x28(%r14),%r12d
  mov    %edx,-0x44(%rsp)
  mov    0x24(%rdi),%edi
  mov    %esi,-0x4c(%rsp)
  mov    %r13d,-0x40(%rsp)
  mov    %r11d,-0x3c(%rsp)
  mov    %r10d,-0x38(%rsp)
  mov    %r8d,-0x34(%rsp)
  mov    %ebp,-0x30(%rsp)
  mov    %ebx,-0x2c(%rsp)
  mov    %r15d,-0x28(%rsp)
  mov    %r9d,-0x24(%rsp)
  mov    %edi,-0x20(%rsp)
  mov    %r12d,-0x1c(%rsp)
  mov    0x30(%r14),%ecx
  mov    0x34(%r14),%edx
  mov    0x38(%r14),%eax
  mov    0x3c(%r14),%r14d
  mov    %ecx,-0x18(%rsp)
  mov    %edx,-0x14(%rsp)
  mov    %eax,-0x10(%rsp)
  mov    %r14d,-0xc(%rsp)
  test   %esi,%esi
  je     L12
  mov    -0x44(%rsp),%esi
  mov    %esi,-0x50(%rsp)
  mov    -0x48(%rsp),%esi
  nopl   0x0(%rax)
L20:
  add    %ebp,%r13d
  add    %ebx,%r11d
  add    %esi,%r10d
  xor    %r13d,%ecx
  xor    %r11d,%edx
  xor    %r10d,%eax
  rol    $0x10,%ecx
  rol    $0x10,%edx
  add    %ecx,%r9d
  add    %edx,%edi
  rol    $0x10,%eax
  xor    %r9d,%ebp
  xor    %edi,%ebx
  add    %eax,%r12d
  rol    $0xc,%ebp
  rol    $0xc,%ebx
  xor    %r12d,%esi
  add    %ebp,%r13d
  add    %ebx,%r11d
  rol    $0xc,%esi
  xor    %r13d,%ecx
  xor    %r11d,%edx
  add    %esi,%r10d
  rol    $0x8,%ecx
  rol    $0x8,%edx
  xor    %r10d,%eax
  add    %ecx,%r9d
  add    %edx,%edi
  xor    %r9d,%ebp
  xor    %edi,%ebx
  mov    %edi,-0x54(%rsp)
  rol    $0x7,%ebp
  rol    $0x7,%ebx
  mov    %r9d,-0x58(%rsp)
  rol    $0x8,%eax
  add    %r15d,%r8d
  add    %ebx,%r13d
  xor    %r8d,%r14d
  add    %eax,%r12d
  mov    %r14d,%edi
  mov    -0x50(%rsp),%r14d
  xor    %r12d,%esi
  rol    $0x10,%edi
  rol    $0x7,%esi
  add    %edi,%r14d
  add    %esi,%r11d
  xor    %r14d,%r15d
  mov    %r14d,%r9d
  xor    %r11d,%ecx
  rol    $0xc,%r15d
  rol    $0x10,%ecx
  add    %r15d,%r8d
  xor    %r8d,%edi
  rol    $0x8,%edi
  add    %edi,%r9d
  xor    %r13d,%edi
  rol    $0x10,%edi
  xor    %r9d,%r15d
  add    %ecx,%r9d
  add    %edi,%r12d
  rol    $0x7,%r15d
  xor    %r12d,%ebx
  rol    $0xc,%ebx
  add    %ebx,%r13d
  xor    %r13d,%edi
  mov    %edi,%r14d
  rol    $0x8,%r14d
  add    %r14d,%r12d
  xor    %r12d,%ebx
  rol    $0x7,%ebx
  xor    %r9d,%esi
  add    %r15d,%r10d
  add    %ebp,%r8d
  rol    $0xc,%esi
  xor    %r10d,%edx
  xor    %r8d,%eax
  rol    $0x10,%edx
  add    %esi,%r11d
  rol    $0x10,%eax
  xor    %r11d,%ecx
  rol    $0x8,%ecx
  lea    (%r9,%rcx,1),%edi
  mov    -0x58(%rsp),%r9d
  xor    %edi,%esi
  mov    %edi,-0x50(%rsp)
  mov    -0x54(%rsp),%edi
  add    %edx,%r9d
  rol    $0x7,%esi
  add    %eax,%edi
  xor    %r9d,%r15d
  xor    %edi,%ebp
  rol    $0xc,%r15d
  rol    $0xc,%ebp
  add    %r15d,%r10d
  add    %ebp,%r8d
  xor    %r10d,%edx
  xor    %r8d,%eax
  rol    $0x8,%edx
  rol    $0x8,%eax
  add    %edx,%r9d
  add    %eax,%edi
  xor    %r9d,%r15d
  xor    %edi,%ebp
  rol    $0x7,%r15d
  rol    $0x7,%ebp
  subl   $0x2,-0x4c(%rsp)
  jne    L20
  mov    %eax,-0x58(%rsp)
L18:
  mov    -0x8(%rsp),%rax
  add    -0x48(%rsp),%esi
  add    -0x34(%rsp),%r8d
  add    -0x40(%rsp),%r13d
  add    -0x3c(%rsp),%r11d
  add    -0x38(%rsp),%r10d
  mov    %esi,0x18(%rax)
  mov    -0x28(%rsp),%esi
  add    -0x18(%rsp),%ecx
  mov    %r8d,0xc(%rax)
  mov    -0x30(%rsp),%r8d
  add    -0x14(%rsp),%edx
  mov    %r13d,(%rax)
  mov    %rax,%r13
  add    %r15d,%esi
  mov    %r11d,0x4(%rax)
  mov    %esi,0x1c(%rax)
  mov    -0x24(%rsp),%esi
  add    %ebp,%r8d
  mov    %r8d,0x10(%rax)
  mov    -0x2c(%rsp),%r8d
  add    %r9d,%esi
  mov    %r10d,0x8(%rax)
  mov    %esi,0x20(%rax)
  mov    -0x20(%rsp),%esi
  add    %ebx,%r8d
  mov    %r8d,0x14(%rax)
  add    %edi,%esi
  mov    %ecx,0x30(%rax)
  mov    %esi,0x24(%rax)
  mov    -0x1c(%rsp),%esi
  mov    %edx,0x34(%rax)
  add    %r12d,%esi
  mov    %esi,0x28(%rax)
  mov    -0x44(%rsp),%esi
  add    -0x50(%rsp),%esi
  mov    %esi,0x2c(%rax)
  mov    -0x58(%rsp),%eax
  add    -0x10(%rsp),%eax
  mov    %eax,0x38(%r13)
  mov    -0xc(%rsp),%eax
  add    %r14d,%eax
  mov    %eax,0x3c(%r13)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L12:
  mov    -0x10(%rsp),%eax
  mov    -0xc(%rsp),%r14d
  mov    -0x14(%rsp),%edx
  mov    -0x18(%rsp),%ecx
  mov    -0x1c(%rsp),%r12d
  mov    -0x20(%rsp),%edi
  mov    %eax,-0x58(%rsp)
  mov    -0x44(%rsp),%eax
  mov    -0x24(%rsp),%r9d
  mov    -0x28(%rsp),%r15d
  mov    -0x48(%rsp),%esi
  mov    -0x2c(%rsp),%ebx
  mov    -0x30(%rsp),%ebp
  mov    %eax,-0x50(%rsp)
  mov    -0x34(%rsp),%r8d
  mov    -0x38(%rsp),%r10d
  mov    -0x3c(%rsp),%r11d
  mov    -0x40(%rsp),%r13d
  jmp    L18
```

assistant: ```c
void neoscrypt_chacha(unsigned int *X, unsigned int rounds) {
  unsigned int 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) {
    x0 += x4;
    t = x12 ^ x0;
    x12 = (((t) << (16)) | ((t) >> (32 - 16)));
    x8 += x12;
    t = x4 ^ x8;
    x4 = (((t) << (12)) | ((t) >> (32 - 12)));
    x0 += x4;
    t = x12 ^ x0;
    x12 = (((t) << (8)) | ((t) >> (32 - 8)));
    x8 += x12;
    t = x4 ^ x8;
    x4 = (((t) << (7)) | ((t) >> (32 - 7)));
    ;
    x1 += x5;
    t = x13 ^ x1;
    x13 = (((t) << (16)) | ((t) >> (32 - 16)));
    x9 += x13;
    t = x5 ^ x9;
    x5 = (((t) << (12)) | ((t) >> (32 - 12)));
    x1 += x5;
    t = x13 ^ x1;
    x13 = (((t) << (8)) | ((t) >> (32 - 8)));
    x9 += x13;
    t = x5 ^ x9;
    x5 = (((t) << (7)) | ((t) >> (32 - 7)));
    ;
    x2 += x6;
    t = x14 ^ x2;
    x14 = (((t) << (16)) | ((t) >> (32 - 16)));
    x10 += x14;
    t = x6 ^ x10;
    x6 = (((t) << (12)) | ((t) >> (32 - 12)));
    x2 += x6;
    t = x14 ^ x2;
    x14 = (((t) << (8)) | ((t) >> (32 - 8)));
    x10 += x14;
    t = x6 ^ x10;
    x6 = (((t) << (7)) | ((t) >> (32 - 7)));
    ;
    x3 += x7;
    t = x15 ^ x3;
    x15 = (((t) << (16)) | ((t) >> (32 - 16)));
    x11 += x15;
    t = x7 ^ x11;
    x7 = (((t) << (12)) | ((t) >> (32 - 12)));
    x3 += x7;
    t = x15 ^ x3;
    x15 = (((t) << (8)) | ((t) >> (32 - 8)));
    x11 += x15;
    t = x7 ^ x11;
    x7 = (((t) << (7)) | ((t) >> (32 - 7)));
    ;
    x0 += x5;
    t = x15 ^ x0;
    x15 = (((t) << (16)) | ((t) >> (32 - 16)));
    x10 += x15;
    t = x5 ^ x10;
    x5 = (((t) << (12)) | ((t) >> (32 - 12)));
    x0 += x5;
    t = x15 ^ x0;
    x15 = (((t) << (8)) | ((t) >> (32 - 8)));
    x10 += x15;
    t = x5 ^ x10;
    x5 = (((t) << (7)) | ((t) >> (32 - 7)));
    ;
    x1 += x6;
    t = x12 ^ x1;
    x12 = (((t) << (16)) | ((t) >> (32 - 16)));
    x11 += x12;
    t = x6 ^ x11;
    x6 = (((t) << (12)) | ((t) >> (32 - 12)));
    x1 += x6;
    t = x12 ^ x1;
    x12 = (((t) << (8)) | ((t) >> (32 - 8)));
    x11 += x12;
    t = x6 ^ x11;
    x6 = (((t) << (7)) | ((t) >> (32 - 7)));
    ;
    x2 += x7;
    t = x13 ^ x2;
    x13 = (((t) << (16)) | ((t) >> (32 - 16)));
    x8 += x13;
    t = x7 ^ x8;
    x7 = (((t) << (12)) | ((t) >> (32 - 12)));
    x2 += x7;
    t = x13 ^ x2;
    x13 = (((t) << (8)) | ((t) >> (32 - 8)));
    x8 += x13;
    t = x7 ^ x8;
    x7 = (((t) << (7)) | ((t) >> (32 - 7)));
    ;
    x3 += x4;
    t = x14 ^ x3;
    x14 = (((t) << (16)) | ((t) >> (32 - 16)));
    x9 += x14;
    t = x4 ^ x9;
    x4 = (((t) << (12)) | ((t) >> (32 - 12)));
    x3 += x4;
    t = x14 ^ x3;
    x14 = (((t) << (8)) | ((t) >> (32 - 8)));
    x9 += x14;
    t = x4 ^ x9;
    x4 = (((t) << (7)) | ((t) >> (32 - 7)));
    ;
  }
  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;
}
```