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

```asm
<IIR_2ndOrder_directII>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <sat_25bits@plt>
  mov    %eax,-0x24(%rbp)
  mov    -0x38(%rbp),%rax
  add    $0x6,%rax
  movzwl (%rax),%eax
  movswq %ax,%rdx
  mov    -0x24(%rbp),%eax
  cltq
  imul   %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  sar    $0xd,%rax
  mov    %eax,-0x18(%rbp)
  mov    -0x38(%rbp),%rax
  add    $0x8,%rax
  movzwl (%rax),%eax
  movswq %ax,%rdx
  mov    -0x30(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  cltq
  imul   %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  sar    $0xd,%rax
  mov    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%eax
  sub    -0x14(%rbp),%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x38(%rbp),%rax
  add    $0xa,%rax
  movzwl (%rax),%eax
  movswq %ax,%rdx
  mov    -0x30(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  cltq
  imul   %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  sar    $0xd,%rax
  mov    %eax,-0x14(%rbp)
  mov    -0x10(%rbp),%eax
  sub    -0x14(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  mov    %eax,%edi
  call   <sat_25bits@plt>
  mov    %eax,-0x14(%rbp)
  mov    -0x30(%rbp),%rax
  mov    -0x14(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x38(%rbp),%rax
  movzwl (%rax),%eax
  movswq %ax,%rdx
  mov    -0x30(%rbp),%rax
  mov    (%rax),%eax
  cltq
  imul   %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  sar    $0xd,%rax
  mov    %eax,-0x18(%rbp)
  mov    -0x38(%rbp),%rax
  add    $0x2,%rax
  movzwl (%rax),%eax
  movswq %ax,%rdx
  mov    -0x30(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  cltq
  imul   %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  sar    $0xd,%rax
  mov    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  movzwl (%rax),%eax
  movswq %ax,%rdx
  mov    -0x30(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  cltq
  imul   %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  sar    $0xd,%rax
  mov    %eax,-0x18(%rbp)
  mov    -0x10(%rbp),%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x30(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0x30(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,(%rdx)
  mov    -0x30(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    -0x30(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,(%rdx)
  mov    -0xc(%rbp),%eax
  leave
  ret
```

assistant: ```c
int IIR_2ndOrder_directII(int x, int w[], const short C[]) {
  int y;
  int memA, memB, memC;
  long lmem;
  x = sat_25bits(x);
  lmem = (long)C[3] * (long)x;
  memA = (int)(lmem >> 13);
  lmem = (long)C[4] * (long)w[1];
  memB = (int)(lmem >> 13);
  memC = memA - memB;
  lmem = (long)C[5] * (long)w[2];
  memB = (int)(lmem >> 13);
  memA = memC - memB;
  memB = sat_25bits(memA);
  w[0] = memB;
  lmem = (long)C[0] * (long)w[0];
  memA = (int)(lmem >> 13);
  lmem = (long)C[1] * (long)w[1];
  memB = (int)(lmem >> 13);
  memC = memA + memB;
  lmem = (long)C[2] * (long)w[2];
  memA = (int)(lmem >> 13);
  y = memC + memA;
  w[2] = w[1];
  w[1] = w[0];
  return y;
}
```