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

```asm
<salsa20_wordtobyte>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x70,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x54(%rbp)
  jmp    L25
L36:
  mov    -0x54(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x54(%rbp),%eax
  cltq
  mov    %edx,-0x50(%rbp,%rax,4)
  addl   $0x1,-0x54(%rbp)
L25:
  cmpl   $0xf,-0x54(%rbp)
  jle    L36
  movl   $0x14,-0x54(%rbp)
  jmp    L37
L47:
  mov    -0x50(%rbp),%edx
  mov    -0x40(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x50(%rbp),%eax
  xor    %edx,%eax
  mov    $0x10,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x20(%rbp)
  mov    -0x30(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x40(%rbp),%edx
  mov    -0x30(%rbp),%eax
  xor    %edx,%eax
  mov    $0xc,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x40(%rbp)
  mov    -0x50(%rbp),%edx
  mov    -0x40(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x50(%rbp),%eax
  xor    %edx,%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x20(%rbp)
  mov    -0x30(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x40(%rbp),%edx
  mov    -0x30(%rbp),%eax
  xor    %edx,%eax
  mov    $0x7,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x40(%rbp)
  mov    -0x4c(%rbp),%edx
  mov    -0x3c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    -0x4c(%rbp),%eax
  xor    %edx,%eax
  mov    $0x10,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x1c(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x3c(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  xor    %edx,%eax
  mov    $0xc,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x3c(%rbp)
  mov    -0x4c(%rbp),%edx
  mov    -0x3c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    -0x4c(%rbp),%eax
  xor    %edx,%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x1c(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x3c(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  xor    %edx,%eax
  mov    $0x7,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x3c(%rbp)
  mov    -0x48(%rbp),%edx
  mov    -0x38(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x48(%rbp)
  mov    -0x18(%rbp),%edx
  mov    -0x48(%rbp),%eax
  xor    %edx,%eax
  mov    $0x10,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x28(%rbp),%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x38(%rbp),%edx
  mov    -0x28(%rbp),%eax
  xor    %edx,%eax
  mov    $0xc,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x38(%rbp)
  mov    -0x48(%rbp),%edx
  mov    -0x38(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x48(%rbp)
  mov    -0x18(%rbp),%edx
  mov    -0x48(%rbp),%eax
  xor    %edx,%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x28(%rbp),%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x38(%rbp),%edx
  mov    -0x28(%rbp),%eax
  xor    %edx,%eax
  mov    $0x7,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x38(%rbp)
  mov    -0x44(%rbp),%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x14(%rbp),%edx
  mov    -0x44(%rbp),%eax
  xor    %edx,%eax
  mov    $0x10,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x14(%rbp)
  mov    -0x24(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x34(%rbp),%edx
  mov    -0x24(%rbp),%eax
  xor    %edx,%eax
  mov    $0xc,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x34(%rbp)
  mov    -0x44(%rbp),%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x14(%rbp),%edx
  mov    -0x44(%rbp),%eax
  xor    %edx,%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x14(%rbp)
  mov    -0x24(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x34(%rbp),%edx
  mov    -0x24(%rbp),%eax
  xor    %edx,%eax
  mov    $0x7,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x34(%rbp)
  mov    -0x50(%rbp),%edx
  mov    -0x3c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x14(%rbp),%edx
  mov    -0x50(%rbp),%eax
  xor    %edx,%eax
  mov    $0x10,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x14(%rbp)
  mov    -0x28(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x3c(%rbp),%edx
  mov    -0x28(%rbp),%eax
  xor    %edx,%eax
  mov    $0xc,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x3c(%rbp)
  mov    -0x50(%rbp),%edx
  mov    -0x3c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x14(%rbp),%edx
  mov    -0x50(%rbp),%eax
  xor    %edx,%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x14(%rbp)
  mov    -0x28(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x3c(%rbp),%edx
  mov    -0x28(%rbp),%eax
  xor    %edx,%eax
  mov    $0x7,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x3c(%rbp)
  mov    -0x4c(%rbp),%edx
  mov    -0x38(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x4c(%rbp),%eax
  xor    %edx,%eax
  mov    $0x10,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x20(%rbp)
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x38(%rbp),%edx
  mov    -0x24(%rbp),%eax
  xor    %edx,%eax
  mov    $0xc,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x38(%rbp)
  mov    -0x4c(%rbp),%edx
  mov    -0x38(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x4c(%rbp),%eax
  xor    %edx,%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x20(%rbp)
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x38(%rbp),%edx
  mov    -0x24(%rbp),%eax
  xor    %edx,%eax
  mov    $0x7,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x38(%rbp)
  mov    -0x48(%rbp),%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x48(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    -0x48(%rbp),%eax
  xor    %edx,%eax
  mov    $0x10,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x1c(%rbp)
  mov    -0x30(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x34(%rbp),%edx
  mov    -0x30(%rbp),%eax
  xor    %edx,%eax
  mov    $0xc,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x34(%rbp)
  mov    -0x48(%rbp),%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x48(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    -0x48(%rbp),%eax
  xor    %edx,%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x1c(%rbp)
  mov    -0x30(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x34(%rbp),%edx
  mov    -0x30(%rbp),%eax
  xor    %edx,%eax
  mov    $0x7,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x34(%rbp)
  mov    -0x44(%rbp),%edx
  mov    -0x40(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x18(%rbp),%edx
  mov    -0x44(%rbp),%eax
  xor    %edx,%eax
  mov    $0x10,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x40(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  xor    %edx,%eax
  mov    $0xc,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x40(%rbp)
  mov    -0x44(%rbp),%edx
  mov    -0x40(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x18(%rbp),%edx
  mov    -0x44(%rbp),%eax
  xor    %edx,%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x40(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  xor    %edx,%eax
  mov    $0x7,%esi
  mov    %eax,%edi
  call   <rotl@plt>
  mov    %eax,-0x40(%rbp)
  subl   $0x2,-0x54(%rbp)
L37:
  cmpl   $0x0,-0x54(%rbp)
  jne    L47
  movl   $0x0,-0x54(%rbp)
  jmp    L73
L84:
  mov    -0x54(%rbp),%eax
  cltq
  mov    -0x50(%rbp,%rax,4),%edx
  mov    -0x54(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x70(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%eax
  add    %eax,%edx
  mov    -0x54(%rbp),%eax
  cltq
  mov    %edx,-0x50(%rbp,%rax,4)
  addl   $0x1,-0x54(%rbp)
L73:
  cmpl   $0xf,-0x54(%rbp)
  jle    L84
  movl   $0x0,-0x54(%rbp)
  jmp    L64
L87:
  mov    -0x54(%rbp),%eax
  cltq
  mov    -0x50(%rbp,%rax,4),%eax
  mov    -0x54(%rbp),%edx
  shl    $0x2,%edx
  movslq %edx,%rcx
  mov    -0x68(%rbp),%rdx
  add    %rcx,%rdx
  mov    %eax,%esi
  mov    %rdx,%rdi
  call   <write32le@plt>
  addl   $0x1,-0x54(%rbp)
L64:
  cmpl   $0xf,-0x54(%rbp)
  jle    L87
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L62
  call   <__stack_chk_fail@plt>
L62:
  leave
  ret
```

assistant: ```c
void salsa20_wordtobyte(unsigned char output[64], const uint32_t input[16]) {
  uint32_t i, x[16];
  for (i = 0; i < 16; ++i)
    x[i] = input[i];
  for (i = 20; i != 0; i -= 2) {
    x[0] += x[4];
    x[12] = rotl(x[12] ^ x[0], 16);
    x[8] += x[12];
    x[4] = rotl(x[4] ^ x[8], 12);
    x[0] += x[4];
    x[12] = rotl(x[12] ^ x[0], 8);
    x[8] += x[12];
    x[4] = rotl(x[4] ^ x[8], 7);
    x[1] += x[5];
    x[13] = rotl(x[13] ^ x[1], 16);
    x[9] += x[13];
    x[5] = rotl(x[5] ^ x[9], 12);
    x[1] += x[5];
    x[13] = rotl(x[13] ^ x[1], 8);
    x[9] += x[13];
    x[5] = rotl(x[5] ^ x[9], 7);
    x[2] += x[6];
    x[14] = rotl(x[14] ^ x[2], 16);
    x[10] += x[14];
    x[6] = rotl(x[6] ^ x[10], 12);
    x[2] += x[6];
    x[14] = rotl(x[14] ^ x[2], 8);
    x[10] += x[14];
    x[6] = rotl(x[6] ^ x[10], 7);
    x[3] += x[7];
    x[15] = rotl(x[15] ^ x[3], 16);
    x[11] += x[15];
    x[7] = rotl(x[7] ^ x[11], 12);
    x[3] += x[7];
    x[15] = rotl(x[15] ^ x[3], 8);
    x[11] += x[15];
    x[7] = rotl(x[7] ^ x[11], 7);
    x[0] += x[5];
    x[15] = rotl(x[15] ^ x[0], 16);
    x[10] += x[15];
    x[5] = rotl(x[5] ^ x[10], 12);
    x[0] += x[5];
    x[15] = rotl(x[15] ^ x[0], 8);
    x[10] += x[15];
    x[5] = rotl(x[5] ^ x[10], 7);
    x[1] += x[6];
    x[12] = rotl(x[12] ^ x[1], 16);
    x[11] += x[12];
    x[6] = rotl(x[6] ^ x[11], 12);
    x[1] += x[6];
    x[12] = rotl(x[12] ^ x[1], 8);
    x[11] += x[12];
    x[6] = rotl(x[6] ^ x[11], 7);
    x[2] += x[7];
    x[13] = rotl(x[13] ^ x[2], 16);
    x[8] += x[13];
    x[7] = rotl(x[7] ^ x[8], 12);
    x[2] += x[7];
    x[13] = rotl(x[13] ^ x[2], 8);
    x[8] += x[13];
    x[7] = rotl(x[7] ^ x[8], 7);
    x[3] += x[4];
    x[14] = rotl(x[14] ^ x[3], 16);
    x[9] += x[14];
    x[4] = rotl(x[4] ^ x[9], 12);
    x[3] += x[4];
    x[14] = rotl(x[14] ^ x[3], 8);
    x[9] += x[14];
    x[4] = rotl(x[4] ^ x[9], 7);
  }
  for (i = 0; i < 16; ++i)
    x[i] += input[i];
  for (i = 0; i < 16; ++i)
    write32le((uint32_t *)(output + 4 * i), x[i]);
}
```