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

```asm
<s16_encode>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x780,%rsp
  mov    %rdi,-0x768(%rbp)
  mov    %rsi,-0x770(%rbp)
  mov    %edx,-0x774(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x1c,-0x750(%rbp)
  movl   $0x15,-0x74c(%rbp)
  movl   $0x15,-0x748(%rbp)
  movl   $0x15,-0x744(%rbp)
  movl   $0xe,-0x740(%rbp)
  movl   $0x9,-0x73c(%rbp)
  movl   $0x8,-0x738(%rbp)
  movl   $0x7,-0x734(%rbp)
  movl   $0x6,-0x730(%rbp)
  movl   $0x6,-0x72c(%rbp)
  movl   $0x5,-0x728(%rbp)
  movl   $0x5,-0x724(%rbp)
  movl   $0x4,-0x720(%rbp)
  movl   $0x3,-0x71c(%rbp)
  movl   $0x2,-0x718(%rbp)
  movl   $0x1,-0x714(%rbp)
  lea    -0x710(%rbp),%rax
  lea    D9(%rip),%rdx
  mov    $0xe0,%ecx
  mov    %rax,%rdi
  mov    %rdx,%rsi
  rep movsq %ds:(%rsi),%es:(%rdi)
  movl   $0x0,-0x760(%rbp)
  jmp    L30
L72:
  mov    -0x768(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x760(%rbp),%edx
  shl    $0x1c,%edx
  mov    %edx,(%rax)
  mov    -0x760(%rbp),%eax
  mov    -0x750(%rbp,%rax,4),%eax
  mov    %eax,%edx
  mov    -0x774(%rbp),%eax
  cmp    %edx,%eax
  cmova  %edx,%eax
  mov    %eax,-0x754(%rbp)
  movl   $0x0,-0x75c(%rbp)
  movl   $0x0,-0x758(%rbp)
  jmp    L47
L45:
  mov    -0x768(%rbp),%rax
  mov    (%rax),%rax
  mov    (%rax),%esi
  mov    -0x770(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x75c(%rbp),%eax
  shl    $0x2,%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x758(%rbp),%eax
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    -0x768(%rbp),%rax
  mov    (%rax),%rax
  add    %esi,%edx
  mov    %edx,(%rax)
  mov    -0x75c(%rbp),%ecx
  mov    -0x760(%rbp),%edx
  mov    %rdx,%rax
  shl    $0x3,%rax
  sub    %rdx,%rax
  shl    $0x2,%rax
  add    %rcx,%rax
  mov    -0x710(%rbp,%rax,4),%eax
  add    %eax,-0x758(%rbp)
  addl   $0x1,-0x75c(%rbp)
L47:
  mov    -0x75c(%rbp),%eax
  cmp    -0x754(%rbp),%eax
  jae    L55
  mov    -0x770(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x75c(%rbp),%eax
  shl    $0x2,%rax
  add    %rdx,%rax
  mov    (%rax),%esi
  mov    -0x75c(%rbp),%ecx
  mov    -0x760(%rbp),%edx
  mov    %rdx,%rax
  shl    $0x3,%rax
  sub    %rdx,%rax
  shl    $0x2,%rax
  add    %rcx,%rax
  mov    -0x710(%rbp,%rax,4),%eax
  mov    %eax,%ecx
  shr    %cl,%esi
  mov    %esi,%eax
  test   %eax,%eax
  je     L45
L55:
  mov    -0x75c(%rbp),%eax
  cmp    -0x754(%rbp),%eax
  jne    L73
  mov    -0x770(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x754(%rbp),%eax
  shl    $0x2,%rax
  add    %rax,%rdx
  mov    -0x770(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x768(%rbp),%rax
  mov    (%rax),%rax
  lea    0x4(%rax),%rdx
  mov    -0x768(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L4
L73:
  addl   $0x1,-0x760(%rbp)
L30:
  cmpl   $0xf,-0x760(%rbp)
  jbe    L72
L4:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L27
  call   <__stack_chk_fail@plt>
L27:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: data_label: D9
data_type: string

tool: D9: 

assistant: ```c
void s16_encode(unsigned int **_w, unsigned int **_p, unsigned int m) {
  int cnum[16] = {28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1};
  int cbits[16][28] = {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0}, {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {3, 4, 4, 4, 4, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {5, 5, 5, 5, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {4, 4, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6, 6, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {5, 5, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {10, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
  unsigned int _k, _j, _m, _o;
  for (_k = 0; _k < 16; _k++) {
    (**_w) = _k << 28;
    _m = (cnum[_k] < m) ? cnum[_k] : m;
    for (_j = 0, _o = 0; (_j < _m) && (*((*_p) + _j) < (1 << cbits[_k][_j]));) {
      (**_w) += ((*((*_p) + _j)) << _o);
      _o += cbits[_k][_j];
      _j++;
    }
    if (_j == _m) {
      (*_p) += _m;
      (*_w)++;
      break;
    }
  }
}
```