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

```asm
<SKP_Silk_NLSF_stabilize>:
  endbr64
  push   %r15
  movslq %edx,%rax
  push   %r14
  mov    $0x8000,%r14d
  push   %r13
  push   %r12
  mov    %rax,%r12
  shl    $0x2,%rax
  push   %rbp
  mov    %rsi,%rbp
  lea    -0x4(%rdi,%rax,1),%r11
  lea    (%rsi,%rax,1),%rsi
  push   %rbx
  lea    -0xc(%rbp,%rax,1),%rax
  lea    -0x4(%r12),%edx
  mov    %rdi,%rbx
  shr    %edx
  sub    $0x48,%rsp
  mov    %rax,0x20(%rsp)
  sub    $0x10,%rax
  mov    %rax,0x28(%rsp)
  lea    0x10(%rbp),%rax
  mov    %r11,0x38(%rsp)
  mov    %rax,0x30(%rsp)
  mov    %rsi,(%rsp)
  lea    0x3(%rdx,%rdx,1),%rsi
  mov    %rsi,0x8(%rsp)
  mov    $0x14,%esi
  nopl   0x0(%rax)
L356:
  mov    (%rbx),%r8d
  mov    0x0(%rbp),%r10d
  mov    %r8d,%edx
  sub    %r10d,%edx
  cmp    $0x1,%r12d
  jle    L57
  cmp    $0x3,%r12d
  jle    L367
  mov    $0x1,%edi
  xor    %ecx,%ecx
L379:
  mov    (%rbx,%rdi,4),%eax
  add    0x0(%rbp,%rdi,4),%r8d
  mov    %edi,%r9d
  mov    %eax,%r13d
  sub    %r8d,%r13d
  cmp    %edx,%r13d
  jge    L127
  mov    %edi,%ecx
  mov    %r13d,%edx
L127:
  mov    0x4(%rbx,%rdi,4),%r8d
  add    0x4(%rbp,%rdi,4),%eax
  lea    0x1(%r9),%r13d
  mov    %r8d,%r15d
  sub    %eax,%r15d
  cmp    %edx,%r15d
  jge    L343
  mov    %r13d,%ecx
  mov    %r15d,%edx
L343:
  lea    0x2(%r9),%eax
  add    $0x2,%rdi
  cmp    0x8(%rsp),%rdi
  jne    L379
L242:
  cltq
  nopw   0x0(%rax,%rax,1)
L11:
  mov    (%rbx,%rax,4),%edi
  mov    0x0(%rbp,%rax,4),%r8d
  add    -0x4(%rbx,%rax,4),%r8d
  sub    %r8d,%edi
  cmp    %edx,%edi
  jge    L348
  mov    %eax,%ecx
  mov    %edi,%edx
L348:
  add    $0x1,%rax
  cmp    %eax,%r12d
  jg     L11
L56:
  mov    (%rsp),%rax
  mov    (%r11),%r8d
  mov    (%rax),%edi
  mov    %r14d,%eax
  add    %edi,%r8d
  sub    %r8d,%eax
  cmp    %edx,%eax
  jge    L273
  mov    %r12d,%ecx
  mov    %eax,%edx
L273:
  test   %edx,%edx
  jns    L15
  test   %ecx,%ecx
  jne    L323
  mov    %r10d,(%rbx)
L50:
  sub    $0x1,%esi
  jne    L356
  mov    %r12d,%esi
  mov    %rbx,%rdi
  lea    -0x2(%r12),%r13d
  call   <SKP_Silk_insertion_sort_increasing_all_values@plt>
  mov    0x0(%rbp),%esi
  mov    (%rbx),%edi
  call   <SKP_max_int@plt>
  mov    %eax,(%rbx)
  cmp    $0x1,%r12d
  jle    L269
  mov    %r13d,%eax
  lea    0x4(%rbp),%r15
  lea    0x4(%rbx),%r14
  lea    0x8(%rbp,%rax,4),%r12
  cs nopw 0x0(%rax,%rax,1)
L190:
  mov    (%r14),%edi
  mov    (%r15),%esi
  add    $0x4,%r15
  add    $0x4,%r14
  add    -0x8(%r14),%esi
  call   <SKP_max_int@plt>
  mov    %eax,-0x4(%r14)
  cmp    %r15,%r12
  jne    L190
  mov    0x38(%rsp),%r14
  mov    (%rsp),%rax
  mov    $0x8000,%esi
  mov    (%r14),%edi
  sub    (%rax),%esi
  call   <SKP_min_int@plt>
  mov    %eax,(%r14)
L245:
  movslq %r13d,%r13
  xchg   %ax,%ax
L59:
  mov    (%rbx,%r13,4),%edi
  mov    0x4(%rbx,%r13,4),%esi
  sub    0x4(%rbp,%r13,4),%esi
  call   <SKP_min_int@plt>
  mov    %eax,(%rbx,%r13,4)
  sub    $0x1,%r13
  test   %r13d,%r13d
  jns    L59
L15:
  add    $0x48,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L323:
  cmp    %r12d,%ecx
  jne    L271
  mov    %r14d,%eax
  sub    %edi,%eax
  mov    %eax,(%r11)
  jmp    L50
  nopw   0x0(%rax,%rax,1)
L271:
  xor    %edx,%edx
  test   %ecx,%ecx
  jle    L31
  lea    -0x1(%rcx),%eax
  cmp    $0x2,%eax
  jbe    L301
  mov    %ecx,%edx
  mov    %rbp,%rax
  pxor   %xmm0,%xmm0
  shr    $0x2,%edx
  sub    $0x1,%edx
  shl    $0x4,%rdx
  add    0x30(%rsp),%rdx
  cs nopw 0x0(%rax,%rax,1)
L164:
  movdqu (%rax),%xmm2
  add    $0x10,%rax
  paddd  %xmm2,%xmm0
  cmp    %rdx,%rax
  jne    L164
  movdqa %xmm0,%xmm1
  mov    %ecx,%eax
  psrldq $0x8,%xmm1
  and    $0xfffffffc,%eax
  paddd  %xmm1,%xmm0
  movdqa %xmm0,%xmm1
  psrldq $0x4,%xmm1
  paddd  %xmm1,%xmm0
  movd   %xmm0,%edx
  test   $0x3,%cl
  je     L31
L225:
  movslq %eax,%rdi
  lea    0x0(,%rdi,4),%r8
  add    0x0(%rbp,%rdi,4),%edx
  lea    0x1(%rax),%edi
  cmp    %edi,%ecx
  jle    L31
  add    $0x2,%eax
  add    0x4(%rbp,%r8,1),%edx
  cmp    %ecx,%eax
  jge    L31
  add    0x8(%rbp,%r8,1),%edx
L31:
  movslq %ecx,%rdi
  shl    $0x2,%rdi
  lea    0x0(%rbp,%rdi,1),%rax
  mov    (%rax),%r8d
  mov    %rax,0x18(%rsp)
  mov    %r8d,%r9d
  sar    %r9d
  lea    (%r9,%rdx,1),%eax
  mov    %eax,0x14(%rsp)
  cmp    %r12d,%ecx
  jge    L224
  mov    %r12d,%r10d
  sub    %ecx,%r10d
  lea    -0x1(%r10),%eax
  cmp    $0x2,%eax
  jbe    L23
  mov    %r10d,%eax
  mov    0x28(%rsp),%r13
  pxor   %xmm1,%xmm1
  shr    $0x2,%eax
  sub    $0x1,%eax
  shl    $0x4,%rax
  sub    %rax,%r13
  mov    0x20(%rsp),%rax
  nopl   0x0(%rax)
L60:
  movdqu (%rax),%xmm3
  sub    $0x10,%rax
  pshufd $0x1b,%xmm3,%xmm0
  psubd  %xmm0,%xmm1
  cmp    %rax,%r13
  jne    L60
  movdqa %xmm1,%xmm0
  mov    %r10d,%r15d
  mov    %r12d,%r13d
  psrldq $0x8,%xmm0
  and    $0xfffffffc,%r15d
  paddd  %xmm0,%xmm1
  sub    %r15d,%r13d
  movdqa %xmm1,%xmm0
  psrldq $0x4,%xmm0
  paddd  %xmm0,%xmm1
  movd   %xmm1,%eax
  add    $0x8000,%eax
  cmp    %r10d,%r15d
  je     L94
L207:
  movslq %r13d,%r10
  lea    0x0(,%r10,4),%r15
  sub    0x0(%rbp,%r10,4),%eax
  lea    -0x1(%r13),%r10d
  cmp    %r10d,%ecx
  jge    L94
  sub    $0x2,%r13d
  sub    -0x4(%rbp,%r15,1),%eax
  cmp    %r13d,%ecx
  jge    L94
  sub    -0x8(%rbp,%r15,1),%eax
L94:
  sub    %r9d,%r8d
  mov    0x14(%rsp),%r15d
  sub    %r8d,%eax
  lea    -0x4(%rbx,%rdi,1),%r8
  add    %rbx,%rdi
  mov    (%rdi),%ecx
  add    (%r8),%ecx
  mov    %ecx,%r10d
  and    $0x1,%ecx
  sar    %r10d
  add    %r10d,%ecx
  cmp    %eax,%r15d
  jle    L124
  cmp    %ecx,%eax
  cmovl  %ecx,%eax
  sub    %r9d,%eax
  cmp    %ecx,%r15d
  cmovge %eax,%edx
L63:
  mov    0x18(%rsp),%rax
  mov    %edx,(%r8)
  add    (%rax),%edx
  mov    %edx,(%rdi)
  jmp    L50
  nop
L57:
  xor    %ecx,%ecx
  jmp    L56
  nopw   0x0(%rax,%rax,1)
L124:
  mov    %eax,%edx
  mov    %r15d,%r10d
  sub    %r9d,%edx
  cmp    %ecx,%r15d
  cmovl  %ecx,%r10d
  sub    %r9d,%r10d
  cmp    %ecx,%eax
  cmovge %r10d,%edx
  jmp    L63
L367:
  xor    %ecx,%ecx
  mov    $0x1,%eax
  jmp    L242
L224:
  mov    $0x8000,%eax
  jmp    L94
L23:
  mov    %r12d,%r13d
  mov    $0x8000,%eax
  jmp    L207
L301:
  xor    %eax,%eax
  xor    %edx,%edx
  jmp    L225
L269:
  mov    0x38(%rsp),%r14
  mov    (%rsp),%rax
  mov    $0x8000,%esi
  mov    (%r14),%edi
  sub    (%rax),%esi
  call   <SKP_min_int@plt>
  mov    %eax,(%r14)
  test   %r13d,%r13d
  js     L15
  jmp    L245
```

assistant: ```c
void SKP_Silk_NLSF_stabilize(int *NLSF_Q15, const int *NDeltaMin_Q15, const int L) {
  int center_freq_Q15, diff_Q15, min_center_Q15, max_center_Q15;
  int min_diff_Q15;
  int loops;
  int i, I = 0, k;
  ;
  for (loops = 0; loops < 20; loops++) {
    min_diff_Q15 = NLSF_Q15[0] - NDeltaMin_Q15[0];
    I = 0;
    for (i = 1; i <= L - 1; i++) {
      diff_Q15 = NLSF_Q15[i] - (NLSF_Q15[i - 1] + NDeltaMin_Q15[i]);
      if (diff_Q15 < min_diff_Q15) {
        min_diff_Q15 = diff_Q15;
        I = i;
      }
    }
    diff_Q15 = (1 << 15) - (NLSF_Q15[L - 1] + NDeltaMin_Q15[L]);
    if (diff_Q15 < min_diff_Q15) {
      min_diff_Q15 = diff_Q15;
      I = L;
    }
    if (min_diff_Q15 >= 0) {
      return;
    }
    if (I == 0) {
      NLSF_Q15[0] = NDeltaMin_Q15[0];
    } else if (I == L) {
      NLSF_Q15[L - 1] = (1 << 15) - NDeltaMin_Q15[L];
    } else {
      min_center_Q15 = 0;
      for (k = 0; k < I; k++) {
        min_center_Q15 += NDeltaMin_Q15[k];
      }
      min_center_Q15 += ((NDeltaMin_Q15[I]) >> (1));
      max_center_Q15 = (1 << 15);
      for (k = L; k > I; k--) {
        max_center_Q15 -= NDeltaMin_Q15[k];
      }
      max_center_Q15 -= (NDeltaMin_Q15[I] - ((NDeltaMin_Q15[I]) >> (1)));
      center_freq_Q15 = ((min_center_Q15) > (max_center_Q15) ? ((((1) == 1 ? (((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) >> 1) + (((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) & 1) : ((((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) >> ((1) - 1)) + 1) >> 1)) > (min_center_Q15) ? (min_center_Q15) : ((((1) == 1 ? (((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) >> 1) + (((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) & 1) : ((((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) >> ((1) - 1)) + 1) >> 1)) < (max_center_Q15) ? (max_center_Q15) : (((1) == 1 ? (((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) >> 1) + (((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) & 1) : ((((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) >> ((1) - 1)) + 1) >> 1)))) : ((((1) == 1 ? (((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) >> 1) + (((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) & 1) : ((((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) >> ((1) - 1)) + 1) >> 1)) > (max_center_Q15) ? (max_center_Q15) : ((((1) == 1 ? (((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) >> 1) + (((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) & 1) : ((((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) >> ((1) - 1)) + 1) >> 1)) < (min_center_Q15) ? (min_center_Q15) : (((1) == 1 ? (((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) >> 1) + (((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) & 1) : ((((int)NLSF_Q15[I - 1] + (int)NLSF_Q15[I]) >> ((1) - 1)) + 1) >> 1)))));
      NLSF_Q15[I - 1] = center_freq_Q15 - ((NDeltaMin_Q15[I]) >> (1));
      NLSF_Q15[I] = NLSF_Q15[I - 1] + NDeltaMin_Q15[I];
    }
  }
  if (loops == 20) {
    SKP_Silk_insertion_sort_increasing_all_values(&NLSF_Q15[0], L);
    NLSF_Q15[0] = SKP_max_int(NLSF_Q15[0], NDeltaMin_Q15[0]);
    for (i = 1; i < L; i++)
      NLSF_Q15[i] = SKP_max_int(NLSF_Q15[i], NLSF_Q15[i - 1] + NDeltaMin_Q15[i]);
    NLSF_Q15[L - 1] = SKP_min_int(NLSF_Q15[L - 1], (1 << 15) - NDeltaMin_Q15[L]);
    for (i = L - 2; i >= 0; i--)
      NLSF_Q15[i] = SKP_min_int(NLSF_Q15[i], NLSF_Q15[i + 1] - NDeltaMin_Q15[i + 1]);
  }
}
```