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

```asm
<qmf_decomp>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  mov    %rsi,%rax
  mov    %rdx,%r10
  mov    %rcx,%r11
  mov    %r8d,%r13d
  mov    %r9d,-0x8(%rsp)
  mov    0x40(%rsp),%rdx
  mov    %rdx,%rsi
  neg    %rsi
  and    $0x3,%esi
  lea    (%rdx,%rsi,1),%r15
  movslq %r9d,%rcx
  shl    $0x2,%rcx
  add    %rcx,%rsi
  lea    (%rdx,%rsi,1),%r8
  mov    %r8,%rdx
  neg    %rdx
  and    $0x3,%edx
  add    %rdx,%r8
  lea    -0x4(%r8,%rcx,1),%rbp
  mov    %r9d,%r14d
  sar    %r14d
  test   %r9d,%r9d
  jle    L52
  mov    %rax,%rdx
  lea    -0x4(%r15,%rcx,1),%rsi
  lea    -0x1(%r9),%edi
  lea    0x4(%rax,%rdi,4),%rax
L124:
  movss  (%rdx),%xmm0
  movss  %xmm0,(%rsi)
  add    $0x4,%rdx
  sub    $0x4,%rsi
  cmp    %rax,%rdx
  jne    L124
L52:
  mov    -0x8(%rsp),%edi
  lea    -0x1(%rdi),%eax
  mov    %eax,-0x4(%rsp)
  test   %eax,%eax
  jle    L119
  mov    0x38(%rsp),%rax
  lea    -0x8(%rax,%rcx,1),%rdx
  mov    %r8,%rax
  lea    -0x2(%rdi),%esi
  lea    0x4(%r8,%rsi,4),%rsi
L87:
  movss  (%rdx),%xmm0
  movss  %xmm0,(%rax)
  sub    $0x4,%rdx
  add    $0x4,%rax
  cmp    %rsi,%rax
  jne    L87
  test   %r13d,%r13d
  jle    L122
L4:
  mov    %r13d,%edx
  add    %r8,%rcx
  mov    $0x0,%eax
L29:
  movss  (%rbx,%rax,4),%xmm0
  movss  %xmm0,-0x4(%rcx,%rax,4)
  add    $0x1,%rax
  cmp    %rdx,%rax
  jne    L29
  lea    -0x1(%r14),%eax
  shr    %eax
  mov    %eax,%eax
  lea    0xc(%r15,%rax,8),%r9
  mov    $0x0,%r12d
L83:
  mov    %r10,%rsi
  movl   $0x0,(%r10)
  mov    %r11,%rdi
  movl   $0x0,(%r11)
  test   %r14d,%r14d
  jle    L76
  lea    0x4(%r15),%rax
  mov    %rbp,%rcx
  mov    %r8,%rdx
L85:
  movss  (%rdx),%xmm0
  addss  (%rcx),%xmm0
  mulss  -0x4(%rax),%xmm0
  addss  (%rsi),%xmm0
  movss  %xmm0,(%rsi)
  movss  (%rdx),%xmm0
  subss  (%rcx),%xmm0
  mulss  -0x4(%rax),%xmm0
  movss  (%rdi),%xmm1
  subss  %xmm0,%xmm1
  movss  %xmm1,(%rdi)
  movss  0x4(%rdx),%xmm0
  addss  -0x4(%rcx),%xmm0
  mulss  (%rax),%xmm0
  addss  (%rsi),%xmm0
  movss  %xmm0,(%rsi)
  movss  0x4(%rdx),%xmm0
  subss  -0x4(%rcx),%xmm0
  mulss  (%rax),%xmm0
  addss  (%rdi),%xmm0
  movss  %xmm0,(%rdi)
  add    $0x8,%rdx
  sub    $0x8,%rcx
  add    $0x8,%rax
  cmp    %r9,%rax
  jne    L85
L76:
  add    $0x2,%r12d
  add    $0x4,%r10
  add    $0x4,%r11
  add    $0x8,%r8
  add    $0x8,%rbp
  cmp    %r12d,%r13d
  jg     L83
  cmpl   $0x0,-0x4(%rsp)
  jle    L94
L122:
  movslq %r13d,%r13
  lea    -0x4(%rbx,%r13,4),%rdx
  mov    0x38(%rsp),%rax
  mov    -0x8(%rsp),%ebx
  lea    -0x2(%rbx),%ecx
  lea    0x4(%rax,%rcx,4),%rcx
L10:
  movss  (%rdx),%xmm0
  movss  %xmm0,(%rax)
  sub    $0x4,%rdx
  add    $0x4,%rax
  cmp    %rax,%rcx
  jne    L10
L94:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L119:
  test   %r13d,%r13d
  jg     L4
  jmp    L94
```

assistant: ```c
void qmf_decomp(float *xx, float *aa, float *y1, float *y2, int N, int M, float *mem, char *stack) {
  int i, j, k, M2;
  float *a;
  float *x;
  float *x2;
  a = ((((stack)) += ((sizeof(float)) - (int)((stack))) & ((sizeof(float)) - 1)), (stack) += ((M) * sizeof(float)), (float *)((stack) - ((M) * sizeof(float))));
  x = ((((stack)) += ((sizeof(float)) - (int)((stack))) & ((sizeof(float)) - 1)), (stack) += ((N + M - 1) * sizeof(float)), (float *)((stack) - ((N + M - 1) * sizeof(float))));
  x2 = x + M - 1;
  M2 = M >> 1;
  for (i = 0; i < M; i++)
    a[M - i - 1] = aa[i];
  for (i = 0; i < M - 1; i++)
    x[i] = mem[M - i - 2];
  for (i = 0; i < N; i++)
    x[i + M - 1] = xx[i];
  for (i = 0, k = 0; i < N; i += 2, k++) {
    y1[k] = 0;
    y2[k] = 0;
    for (j = 0; j < M2; j++) {
      y1[k] += a[j] * (x[i + j] + x2[i - j]);
      y2[k] -= a[j] * (x[i + j] - x2[i - j]);
      j++;
      y1[k] += a[j] * (x[i + j] + x2[i - j]);
      y2[k] += a[j] * (x[i + j] - x2[i - j]);
    }
  }
  for (i = 0; i < M - 1; i++)
    mem[i] = xx[N - i - 1];
}
```