user: What is the c source code of the assembly code below?

```asm
<conv_de>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x58(%rbp)
  mov    %rsi,-0x60(%rbp)
  mov    %edx,-0x64(%rbp)
  mov    %ecx,-0x68(%rbp)
  movl   $0x0,-0x50(%rbp)
  jmp    L40
L1:
  mov    -0x60(%rbp),%rax
  movw   $0x0,(%rax)
  addq   $0x2,-0x60(%rbp)
  addl   $0x1,-0x50(%rbp)
L40:
  mov    -0x64(%rbp),%eax
  cmp    -0x50(%rbp),%eax
  jge    L1
  mov    -0x64(%rbp),%eax
  cltq
  add    $0x1,%rax
  add    %rax,%rax
  add    %rax,-0x58(%rbp)
  mov    -0x64(%rbp),%eax
  cltq
  add    %rax,%rax
  mov    $0xfffffffffffffffe,%rdx
  sub    %rax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x64(%rbp),%eax
  cltq
  add    %rax,%rax
  neg    %rax
  mov    %rax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x64(%rbp),%eax
  movslq %eax,%rdx
  mov    $0x1,%eax
  sub    %rdx,%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x58(%rbp),%rax
  sub    $0x2,%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x58(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x58(%rbp),%rax
  add    $0x2,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x64(%rbp),%eax
  cltq
  add    %rax,%rax
  lea    -0x2(%rax),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x64(%rbp),%eax
  cltq
  lea    (%rax,%rax,1),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x64(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x64(%rbp),%eax
  add    $0x1,%eax
  add    %eax,%eax
  sub    %eax,-0x68(%rbp)
  movl   $0x0,-0x50(%rbp)
  jmp    L36
L27:
  mov    -0x48(%rbp),%rax
  movzwl (%rax),%eax
  movswl %ax,%edx
  mov    -0x40(%rbp),%rax
  movzwl (%rax),%eax
  cwtl
  add    %eax,%edx
  mov    -0x38(%rbp),%rax
  movzwl (%rax),%eax
  cwtl
  add    %eax,%edx
  mov    -0x30(%rbp),%rax
  movzwl (%rax),%eax
  cwtl
  lea    (%rdx,%rax,1),%ecx
  mov    -0x28(%rbp),%rax
  movzwl (%rax),%eax
  movswl %ax,%edx
  mov    %edx,%eax
  shl    $0x3,%eax
  add    %edx,%eax
  lea    (%rcx,%rax,1),%edx
  mov    -0x20(%rbp),%rax
  movzwl (%rax),%eax
  cwtl
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  movzwl (%rax),%eax
  cwtl
  add    %eax,%edx
  mov    -0x10(%rbp),%rax
  movzwl (%rax),%eax
  cwtl
  add    %eax,%edx
  mov    -0x8(%rbp),%rax
  movzwl (%rax),%eax
  cwtl
  add    %edx,%eax
  lea    0xfff(%rax),%edx
  test   %eax,%eax
  cmovs  %edx,%eax
  sar    $0xc,%eax
  sub    $0x1,%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x4c(%rbp),%eax
  mov    %eax,%edx
  neg    %edx
  cmovns %edx,%eax
  mov    %eax,-0x4c(%rbp)
  cmpl   $0xfff,-0x4c(%rbp)
  jle    L55
  mov    -0x60(%rbp),%rax
  movw   $0xfff,(%rax)
  jmp    L5
L55:
  mov    -0x4c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x60(%rbp),%rax
  mov    %dx,(%rax)
L5:
  addq   $0x2,-0x60(%rbp)
  addq   $0x2,-0x48(%rbp)
  addq   $0x2,-0x40(%rbp)
  addq   $0x2,-0x38(%rbp)
  addq   $0x2,-0x30(%rbp)
  addq   $0x2,-0x28(%rbp)
  addq   $0x2,-0x20(%rbp)
  addq   $0x2,-0x18(%rbp)
  addq   $0x2,-0x10(%rbp)
  addq   $0x2,-0x8(%rbp)
  addl   $0x1,-0x50(%rbp)
L36:
  mov    -0x50(%rbp),%eax
  cmp    -0x68(%rbp),%eax
  jl     L27
  movl   $0x0,-0x50(%rbp)
  jmp    L75
L63:
  mov    -0x60(%rbp),%rax
  movw   $0x0,(%rax)
  addq   $0x2,-0x60(%rbp)
  addl   $0x1,-0x50(%rbp)
L75:
  mov    -0x64(%rbp),%eax
  cmp    -0x50(%rbp),%eax
  jge    L63
  nop
  nop
  pop    %rbp
  ret
```

assistant: ```c
void conv_de(short int *src, short int *dst, int ncol, int npix) {
  short int *i0, *i1, *i2, *i3, *i4, *i5, *i6, *i7, *i8;
  int i, res;
  for (i = 0; i < ncol + 1; ++i) {
    *dst = 0;
    ++dst;
  }
  src += ncol + 1;
  i0 = src - ncol - 1;
  i1 = src - ncol;
  i2 = src - ncol + 1;
  i3 = src - 1;
  i4 = src;
  i5 = src + 1;
  i6 = src + ncol - 1;
  i7 = src + ncol;
  i8 = src + ncol + 1;
  npix -= 2 * (ncol + 1);
  for (i = 0; i < npix; ++i) {
    res = (*i0 + *i1 + *i2 + *i3 + *i4 * 9 + *i5 + *i6 + *i7 + *i8) / 4096 - 1;
    res = ((((int)res) > 0) ? (((int)res)) : (-((int)res)));
    if (res > 4096 - 1)
      *dst = 4096 - 1;
    else
      *dst = res;
    dst++;
    i0++;
    i1++;
    i2++;
    i3++;
    i4++;
    i5++;
    i6++;
    i7++;
    i8++;
  }
  for (i = 0; i < ncol + 1; ++i) {
    *dst = 0;
    ++dst;
  }
}
```