user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<fpsconv>:
  endbr64
  lea    (%rsi,%r8,1),%eax
  push   %r15
  mov    %rdx,%r11
  mov    %rcx,%r10
  push   %r14
  mov    %r9,%r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %esi,%ebx
  cmp    %eax,%esi
  jge    L92
  movslq %ebx,%rdx
  lea    -0x1(%r8),%esi
  lea    0x0(,%rdx,8),%rcx
  cmp    $0x2,%esi
  jbe    L35
  cmp    $0x8,%rcx
  je     L35
  mov    %r8d,%edx
  add    %rdi,%rcx
  xor    %eax,%eax
  shr    %edx
  shl    $0x4,%rdx
  nopl   0x0(%rax)
L29:
  movupd (%rdi,%rax,1),%xmm5
  movups %xmm5,(%rcx,%rax,1)
  add    $0x10,%rax
  cmp    %rdx,%rax
  jne    L29
  mov    %r8d,%eax
  and    $0xfffffffe,%eax
  lea    (%rbx,%rax,1),%edx
  cmp    %eax,%r8d
  je     L92
  cltq
  movsd  (%rdi,%rax,8),%xmm0
  movslq %edx,%rax
  movsd  %xmm0,(%rdi,%rax,8)
L92:
  test   %ebx,%ebx
  jle    L86
  sub    $0x1,%ebx
  lea    0x1(%r8),%r15d
  mov    %rdi,%rsi
  xor    %r9d,%r9d
  shr    %ebx
  mov    %r15d,%r13d
  mov    %r15d,-0xc(%rsp)
  pxor   %xmm5,%xmm5
  lea    0x1(%rbx),%eax
  and    $0xfffffffe,%r13d
  mov    %rax,-0x18(%rsp)
  movslq %r8d,%rax
  lea    -0x8(,%rax,8),%rbp
  mov    %r15d,%eax
  mov    0x38(%rsp),%r15
  shr    %eax
  lea    (%r11,%rbp,1),%r12
  add    %r10,%rbp
  lea    -0x1(%rax),%ebx
  not    %rbx
  shl    $0x4,%rbx
  nopl   0x0(%rax)
L18:
  lea    (%r9,%r9,1),%edx
  movapd %xmm5,%xmm3
  movapd %xmm5,%xmm1
  test   %r8d,%r8d
  js     L40
  je     L98
  xor    %eax,%eax
  movapd %xmm5,%xmm3
  movapd %xmm5,%xmm1
  nopl   (%rax)
L30:
  mov    %rax,%rcx
  movupd (%r12,%rax,1),%xmm0
  neg    %rcx
  movupd (%rsi,%rcx,1),%xmm4
  shufpd $0x1,%xmm0,%xmm0
  mulpd  %xmm4,%xmm0
  addsd  %xmm0,%xmm1
  unpckhpd %xmm0,%xmm0
  addsd  %xmm0,%xmm1
  movupd 0x0(%rbp,%rax,1),%xmm0
  sub    $0x10,%rax
  shufpd $0x1,%xmm0,%xmm0
  mulpd  %xmm4,%xmm0
  addsd  %xmm0,%xmm3
  unpckhpd %xmm0,%xmm0
  addsd  %xmm0,%xmm3
  cmp    %rbx,%rax
  jne    L30
  mov    %r13d,%eax
  cmp    -0xc(%rsp),%r13d
  je     L40
L114:
  add    %eax,%edx
  movslq %edx,%rdx
  movsd  (%rdi,%rdx,8),%xmm0
  mov    %r8d,%edx
  sub    %eax,%edx
  movslq %edx,%rdx
  movsd  (%r11,%rdx,8),%xmm2
  mulsd  %xmm0,%xmm2
  mulsd  (%r10,%rdx,8),%xmm0
  addsd  %xmm2,%xmm1
  addsd  %xmm0,%xmm3
L40:
  movsd  %xmm1,(%r14,%r9,8)
  add    $0x10,%rsi
  movsd  %xmm3,(%r15,%r9,8)
  add    $0x1,%r9
  cmp    %r9,-0x18(%rsp)
  jne    L18
L86:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L98:
  xor    %eax,%eax
  movapd %xmm5,%xmm3
  movapd %xmm5,%xmm1
  jmp    L114
L35:
  mov    %rdi,%rax
  lea    0x8(%rdi,%rsi,8),%rcx
  nopl   0x0(%rax)
L45:
  movsd  (%rax),%xmm0
  movsd  %xmm0,(%rax,%rdx,8)
  add    $0x8,%rax
  cmp    %rcx,%rax
  jne    L45
  jmp    L92
```

assistant: ```c
void fpsconv(double *x_in, int lx, double *h0, double *h1, int lhm1, double *x_outl, double *x_outh) {
  int i, j, ind;
  double x0, x1;
  for (i = lx; i < lx + lhm1; i++)
    x_in[i] = *(x_in + (i - lx));
  ind = 0;
  for (i = 0; i < (lx); i += 2) {
    x0 = 0;
    x1 = 0;
    for (j = 0; j <= lhm1; j++) {
      x0 = x0 + x_in[i + j] * h0[lhm1 - j];
      x1 = x1 + x_in[i + j] * h1[lhm1 - j];
    }
    x_outl[ind] = x0;
    x_outh[ind++] = x1;
  }
}
```