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

```asm
<SKP_Silk_NLSF_stabilize>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%rbx
  mov    %rsi,%rbp
  mov    %edx,%r12d
  movslq %edx,%rax
  shl    $0x2,%rax
  lea    -0x4(%rdi,%rax,1),%r14
  lea    (%rsi,%rax,1),%r13
  mov    $0x0,%edi
  mov    $0x0,%r11d
  mov    %edx,%eax
  mov    $0x8000,%r15d
  lea    -0x4(%r13),%rdx
  mov    %rdx,0x18(%rsp)
  lea    -0x1(%r12),%edx
  mov    %edx,0x24(%rsp)
  lea    0x4(%rsi),%rdx
  mov    %rdx,0x28(%rsp)
  jmp    L228
L10:
  add    $0x1,%rcx
  cmp    %rax,%rcx
  je     L34
L93:
  mov    0x0(%rbp,%rcx,4),%r8d
  add    -0x4(%rbx,%rcx,4),%r8d
  mov    (%rbx,%rcx,4),%esi
  sub    %r8d,%esi
  cmp    %r9d,%esi
  jge    L10
  mov    %ecx,%edx
  mov    %esi,%r9d
  jmp    L10
L141:
  mov    %r11d,%edx
L34:
  mov    0x0(%r13),%esi
  mov    %esi,%r8d
  add    (%r14),%r8d
  mov    %r15d,%ecx
  sub    %r8d,%ecx
  cmp    %r9d,%ecx
  jge    L214
  mov    %r12d,%edx
  mov    %ecx,%r9d
L214:
  test   %r9d,%r9d
  jns    L28
  test   %edx,%edx
  jne    L68
  mov    %r10d,(%rbx)
L5:
  add    $0x1,%edi
  cmp    $0x14,%edi
  je     L219
L228:
  mov    0x0(%rbp),%r10d
  mov    (%rbx),%r9d
  sub    %r10d,%r9d
  cmp    $0x1,%r12d
  jle    L141
  mov    $0x1,%ecx
  mov    %r11d,%edx
  jmp    L93
L68:
  cmp    %r12d,%edx
  jne    L108
  mov    %r15d,%edx
  sub    %esi,%edx
  mov    %edx,(%r14)
  jmp    L5
L108:
  mov    %r11d,%ecx
  test   %edx,%edx
  jle    L18
  lea    -0x1(%rdx),%ecx
  mov    0x28(%rsp),%rsi
  lea    (%rsi,%rcx,4),%r8
  mov    %rbp,%rsi
  mov    %r11d,%ecx
L222:
  add    (%rsi),%ecx
  add    $0x4,%rsi
  cmp    %r8,%rsi
  jne    L222
L18:
  movslq %edx,%r10
  lea    0x0(,%r10,4),%rsi
  mov    %rsi,0x8(%rsp)
  add    %rbp,%rsi
  mov    %rsi,0x10(%rsp)
  mov    (%rsi),%r9d
  mov    %r9d,%esi
  sar    %esi
  mov    %esi,(%rsp)
  add    %esi,%ecx
  cmp    %r12d,%edx
  jge    L221
  mov    0x24(%rsp),%esi
  sub    %edx,%esi
  lea    0x0(,%rsi,4),%rdx
  mov    0x18(%rsp),%r8
  sub    %rdx,%r8
  mov    %r13,%rdx
  mov    $0x8000,%esi
L94:
  sub    (%rdx),%esi
  sub    $0x4,%rdx
  cmp    %r8,%rdx
  jne    L94
L118:
  sub    (%rsp),%r9d
  sub    %r9d,%esi
  cmp    %esi,%ecx
  jle    L152
  mov    (%rbx,%r10,4),%edx
  mov    0x8(%rsp),%r9
  add    -0x4(%rbx,%r9,1),%edx
  mov    %edx,%r8d
  sar    %r8d
  and    $0x1,%edx
  add    %r8d,%edx
  cmp    %esi,%edx
  cmovge %edx,%esi
  cmp    %ecx,%edx
  cmovle %esi,%ecx
L113:
  sub    (%rsp),%ecx
  mov    0x8(%rsp),%rdx
  mov    %ecx,-0x4(%rbx,%rdx,1)
  mov    0x10(%rsp),%rdx
  add    (%rdx),%ecx
  mov    %ecx,(%rbx,%r10,4)
  jmp    L5
L221:
  mov    $0x8000,%esi
  jmp    L118
L152:
  mov    (%rbx,%r10,4),%edx
  mov    0x8(%rsp),%r9
  add    -0x4(%rbx,%r9,1),%edx
  mov    %edx,%r8d
  sar    %r8d
  and    $0x1,%edx
  add    %r8d,%edx
  cmp    %edx,%ecx
  cmovl  %edx,%ecx
  cmp    %esi,%edx
  cmovg  %esi,%ecx
  jmp    L113
L219:
  mov    %r12d,%esi
  mov    %rbx,%rdi
  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    L6
  lea    0x4(%rbp),%rdi
  lea    0x4(%rbx),%r15
  lea    -0x2(%r12),%eax
  lea    0x8(%rbp,%rax,4),%rax
  mov    %r14,(%rsp)
  mov    %rdi,%r14
  mov    %rbx,0x8(%rsp)
  mov    %rax,%rbx
L84:
  mov    (%r14),%esi
  add    -0x4(%r15),%esi
  mov    (%r15),%edi
  call   <SKP_max_int@plt>
  mov    %eax,(%r15)
  add    $0x4,%r14
  add    $0x4,%r15
  cmp    %rbx,%r14
  jne    L84
  mov    (%rsp),%r14
  mov    0x8(%rsp),%rbx
  mov    $0x8000,%esi
  sub    0x0(%r13),%esi
  mov    (%r14),%edi
  call   <SKP_min_int@plt>
  mov    %eax,(%r14)
  sub    $0x2,%r12d
  movslq %r12d,%r12
L202:
  mov    0x4(%rbx,%r12,4),%esi
  sub    0x4(%rbp,%r12,4),%esi
  mov    (%rbx,%r12,4),%edi
  call   <SKP_min_int@plt>
  mov    %eax,(%rbx,%r12,4)
  sub    $0x1,%r12
  test   %r12d,%r12d
  jns    L202
L28:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L6:
  mov    $0x8000,%esi
  sub    0x0(%r13),%esi
  mov    (%r14),%edi
  call   <SKP_min_int@plt>
  mov    %eax,(%r14)
  jmp    L28
```

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]);
  }
}
```