user: What would the C source look like for the assembly code provided here?

```asm
<fast_forward_dst>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %edx,-0x44(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x44(%rbp),%eax
  sub    $0x1,%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  mov    %eax,-0x24(%rbp)
  movl   $0x0,-0x28(%rbp)
  jmp    L20
L7:
  mov    -0x28(%rbp),%eax
  shl    $0x2,%eax
  cltq
  lea    (%rax,%rax,1),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  movswl %ax,%edx
  mov    -0x28(%rbp),%eax
  shl    $0x2,%eax
  cltq
  add    $0x3,%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0x38(%rbp),%rax
  add    %rcx,%rax
  movzwl (%rax),%eax
  cwtl
  add    %edx,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x28(%rbp),%eax
  shl    $0x2,%eax
  cltq
  add    $0x1,%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  movswl %ax,%edx
  mov    -0x28(%rbp),%eax
  shl    $0x2,%eax
  cltq
  add    $0x3,%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0x38(%rbp),%rax
  add    %rcx,%rax
  movzwl (%rax),%eax
  cwtl
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x28(%rbp),%eax
  shl    $0x2,%eax
  cltq
  lea    (%rax,%rax,1),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  cwtl
  mov    -0x28(%rbp),%edx
  shl    $0x2,%edx
  movslq %edx,%rdx
  add    $0x1,%rdx
  lea    (%rdx,%rdx,1),%rcx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  movzwl (%rdx),%edx
  movswl %dx,%edx
  sub    %edx,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x28(%rbp),%eax
  shl    $0x2,%eax
  cltq
  add    $0x2,%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  cwtl
  imul   $0x4a,%eax,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x20(%rbp),%eax
  imul   $0x1d,%eax,%edx
  mov    -0x1c(%rbp),%eax
  imul   $0x37,%eax,%eax
  add    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %eax,%edx
  mov    -0x24(%rbp),%eax
  add    %eax,%edx
  mov    -0x44(%rbp),%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    (%rax,%rax,1),%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  mov    %dx,(%rax)
  mov    -0x28(%rbp),%eax
  shl    $0x2,%eax
  cltq
  lea    (%rax,%rax,1),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  movswl %ax,%edx
  mov    -0x28(%rbp),%eax
  shl    $0x2,%eax
  cltq
  add    $0x1,%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0x38(%rbp),%rax
  add    %rcx,%rax
  movzwl (%rax),%eax
  cwtl
  add    %eax,%edx
  mov    -0x28(%rbp),%eax
  shl    $0x2,%eax
  cltq
  add    $0x3,%rax
  lea    (%rax,%rax,1),%rcx
  mov    -0x38(%rbp),%rax
  add    %rcx,%rax
  movzwl (%rax),%eax
  movswl %ax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  imul   $0x4a,%eax,%edx
  mov    -0x24(%rbp),%eax
  add    %eax,%edx
  mov    -0x44(%rbp),%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    -0x28(%rbp),%eax
  add    $0x4,%eax
  cltq
  lea    (%rax,%rax,1),%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  mov    %dx,(%rax)
  mov    -0x18(%rbp),%eax
  imul   $0x1d,%eax,%edx
  mov    -0x20(%rbp),%eax
  imul   $0x37,%eax,%eax
  add    %edx,%eax
  mov    -0x14(%rbp),%edx
  sub    %edx,%eax
  mov    %eax,%ecx
  mov    -0x24(%rbp),%eax
  lea    (%rcx,%rax,1),%edx
  mov    -0x44(%rbp),%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    -0x28(%rbp),%eax
  add    $0x8,%eax
  cltq
  lea    (%rax,%rax,1),%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  mov    %dx,(%rax)
  mov    -0x18(%rbp),%eax
  imul   $0x37,%eax,%edx
  mov    -0x1c(%rbp),%eax
  imul   $0xffffffe3,%eax,%eax
  add    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %eax,%edx
  mov    -0x24(%rbp),%eax
  add    %eax,%edx
  mov    -0x44(%rbp),%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    -0x28(%rbp),%eax
  add    $0xc,%eax
  cltq
  lea    (%rax,%rax,1),%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  mov    %dx,(%rax)
  addl   $0x1,-0x28(%rbp)
L20:
  cmpl   $0x3,-0x28(%rbp)
  jle    L7
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L28
  call   <__stack_chk_fail@plt>
L28:
  leave
  ret
```

assistant: ```c
void fast_forward_dst(short *block, short *coeff, int32_t shift) {
  int32_t i, c[4];
  int32_t rnd_factor = 1 << (shift - 1);
  for (i = 0; i < 4; i++) {
    c[0] = block[4 * i + 0] + block[4 * i + 3];
    c[1] = block[4 * i + 1] + block[4 * i + 3];
    c[2] = block[4 * i + 0] - block[4 * i + 1];
    c[3] = 74 * block[4 * i + 2];
    coeff[i] = (short)((29 * c[0] + 55 * c[1] + c[3] + rnd_factor) >> shift);
    coeff[4 + i] = (short)((74 * (block[4 * i + 0] + block[4 * i + 1] - block[4 * i + 3]) + rnd_factor) >> shift);
    coeff[8 + i] = (short)((29 * c[2] + 55 * c[0] - c[3] + rnd_factor) >> shift);
    coeff[12 + i] = (short)((55 * c[2] - 29 * c[1] + c[3] + rnd_factor) >> shift);
  }
}
```