user: 请从给定的汇编指令推导出C源代码:

```asm
<SKP_Silk_LTP_analysis_filter_FIX>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x58,%rsp
  mov    %rdi,%rbx
  mov    %rsi,%rbp
  mov    %rcx,0x20(%rsp)
  mov    %r8,%r14
  mov    %fs:0x28,%rax
  mov    %rax,0x48(%rsp)
  xor    %eax,%eax
  mov    %r9d,%edi
  add    0x90(%rsp),%edi
  mov    %edi,0x1c(%rsp)
  movslq %edi,%rax
  add    %rax,%rax
  mov    %rax,0x8(%rsp)
  movslq %r9d,%r9
  lea    (%r9,%r9,1),%rax
  mov    %rax,0x10(%rsp)
  mov    %rdx,%r15
  mov    $0x0,%r12d
  mov    %edi,%eax
  mov    %rax,0x28(%rsp)
  lea    0x46(%rsp),%r8
  jmp    L36
L28:
  mov    %dx,(%rbx,%r9,2)
  mov    (%r14,%r12,4),%ecx
  movzwl %cx,%eax
  movswl %dx,%esi
  imul   %esi,%eax
  sar    $0x10,%eax
  sar    $0x10,%ecx
  imul   %ecx,%edx
  add    %eax,%edx
  mov    %dx,(%rbx,%r9,2)
  add    $0x2,%r11
  add    $0x1,%r9
  cmp    %r9,%r15
  je     L37
L55:
  movzwl 0x0(%rbp,%r9,2),%r10d
  mov    %r10w,(%rbx,%r9,2)
  movswl 0x4(%r11),%eax
  imul   %r13d,%eax
  lea    0x2(%r11),%rsi
  lea    0x3e(%rsp),%rdx
L90:
  movswl (%rsi),%ecx
  movswl 0x2(%rdx),%edi
  imul   %edi,%ecx
  add    %ecx,%eax
  sub    $0x2,%rsi
  add    $0x2,%rdx
  cmp    %r8,%rdx
  jne    L90
  sar    $0xd,%eax
  add    $0x1,%eax
  sar    %eax
  movswl %r10w,%ecx
  sub    %eax,%ecx
  mov    $0x7fff,%edx
  cmp    $0x7fff,%ecx
  jg     L28
  sub    %eax,%r10d
  cmp    $0xffff7fff,%ecx
  mov    $0xffff8000,%edx
  cmovg  %r10d,%edx
  jmp    L28
L37:
  mov    (%rsp),%r15
L48:
  add    0x8(%rsp),%rbx
  add    0x10(%rsp),%rbp
  add    $0x1,%r12
  add    $0xa,%r15
  cmp    $0x4,%r12
  je     L51
L36:
  mov    0x20(%rsp),%rax
  movslq (%rax,%r12,4),%rax
  add    %rax,%rax
  mov    %rbp,%r11
  sub    %rax,%r11
  mov    $0x0,%eax
L80:
  movzwl (%r15,%rax,1),%edx
  mov    %dx,0x3e(%rsp,%rax,1)
  add    $0x2,%rax
  cmp    $0xa,%rax
  jne    L80
  cmpl   $0x0,0x1c(%rsp)
  jle    L48
  movswl 0x3e(%rsp),%r13d
  mov    $0x0,%r9d
  mov    %r15,(%rsp)
  mov    0x28(%rsp),%r15
  jmp    L55
L51:
  mov    0x48(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L83
  add    $0x58,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L83:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void SKP_Silk_LTP_analysis_filter_FIX(short *LTP_res, const short *x, const short LTPCoef_Q14[5 * 4], const int pitchL[4], const int invGains_Q16[4], const int subfr_length, const int pre_length) {
  const short *x_ptr, *x_lag_ptr;
  short Btmp_Q14[5];
  short *LTP_res_ptr;
  int k, i, j;
  int LTP_est;
  x_ptr = x;
  LTP_res_ptr = LTP_res;
  for (k = 0; k < 4; k++) {
    x_lag_ptr = x_ptr - pitchL[k];
    for (i = 0; i < 5; i++) {
      Btmp_Q14[i] = LTPCoef_Q14[k * 5 + i];
    }
    for (i = 0; i < subfr_length + pre_length; i++) {
      LTP_res_ptr[i] = x_ptr[i];
      LTP_est = ((int)((short)(x_lag_ptr[5 / 2])) * (int)((short)(Btmp_Q14[0])));
      for (j = 1; j < 5; j++) {
        LTP_est = ((int)((unsigned int)((LTP_est)) + (unsigned int)(((int)((short)((x_lag_ptr[5 / 2 - j]))) * (int)((short)((Btmp_Q14[j])))))));
      }
      LTP_est = ((14) == 1 ? ((LTP_est) >> 1) + ((LTP_est)&1) : (((LTP_est) >> ((14) - 1)) + 1) >> 1);
      LTP_res_ptr[i] = (short)(((int)x_ptr[i] - LTP_est) > 0x7FFF ? 0x7FFF : (((int)x_ptr[i] - LTP_est) < ((short)0x8000) ? ((short)0x8000) : ((int)x_ptr[i] - LTP_est)));
      LTP_res_ptr[i] = ((((invGains_Q16[k]) >> 16) * (int)((short)(LTP_res_ptr[i]))) + ((((invGains_Q16[k]) & 0x0000FFFF) * (int)((short)(LTP_res_ptr[i]))) >> 16));
      x_lag_ptr++;
    }
    LTP_res_ptr += subfr_length + pre_length;
    x_ptr += subfr_length;
  }
}
```