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

```asm
<R4Core>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %rdi,0x88(%rsp)
  mov    %esi,0x84(%rsp)
  mov    %edx,0x80(%rsp)
  mov    %rcx,0x50(%rsp)
  test   %esi,%esi
  je     L45
  nopl   0x0(%rax,%rax,1)
L26:
  mov    0x80(%rsp),%ebx
  lea    (%rbx,%rbx,1),%eax
  movslq %eax,%rdx
  add    %ebx,%eax
  add    %eax,%eax
  lea    0x0(,%rdx,4),%r15
  cltq
  lea    0x0(,%rax,4),%rdi
  mov    %rdi,0x78(%rsp)
  test   %ebx,%ebx
  je     L27
  lea    -0x1(%rbx),%eax
  shl    $0x3,%rdx
  lea    0x8(%rdi,%rax,8),%rcx
  mov    %rdx,0x68(%rsp)
  lea    0x8(%rdi,%rax,8),%rax
  mov    0x84(%rsp),%edx
  mov    %rcx,0x58(%rsp)
  mov    %ebx,%ecx
  mov    0x88(%rsp),%rbx
  mov    %edx,0x64(%rsp)
  lea    (%rbx,%rcx,8),%rcx
  mov    %rax,0x70(%rsp)
  mov    %rcx,0x40(%rsp)
  xchg   %ax,%ax
L30:
  mov    0x68(%rsp),%rax
  mov    0x50(%rsp),%rdx
  mov    %rbx,0x48(%rsp)
  lea    (%rax,%rbx,1),%rcx
  nopl   0x0(%rax,%rax,1)
L5:
  mov    (%rdx),%r13d
  mov    0x4(%rdx),%edi
  mov    %rcx,0x18(%rsp)
  add    $0x8,%rbx
  mov    -0x8(%rbx,%r15,1),%ebp
  mov    -0x4(%rbx,%r15,1),%r14d
  mov    %rdx,0x8(%rsp)
  movq   -0x8(%rbx),%xmm0
  lea    0x0(%r13,%rdi,2),%r9d
  lea    0x0(%rbp,%r14,1),%esi
  mov    %r9d,0x60(%rsp)
  psrad  $0x2,%xmm0
  movq   %xmm0,0x10(%rsp)
  call   <cook_MULSHIFT32@plt>
  mov    0x60(%rsp),%edi
  mov    %ebp,%esi
  mov    %eax,%r12d
  call   <cook_MULSHIFT32@plt>
  mov    %r14d,%esi
  mov    %r13d,%edi
  sub    %r12d,%eax
  mov    %eax,%ebp
  call   <cook_MULSHIFT32@plt>
  movd   %ebp,%xmm1
  mov    0x8(%rsp),%rdx
  mov    0x18(%rsp),%rcx
  add    %r12d,%eax
  movq   0x10(%rsp),%xmm0
  movd   %eax,%xmm4
  mov    0x8(%rdx),%r13d
  mov    (%rcx),%ebp
  mov    %rdx,0x10(%rsp)
  punpckldq %xmm4,%xmm1
  mov    0x4(%rcx),%r14d
  mov    0xc(%rdx),%edi
  mov    %rcx,0x8(%rsp)
  movdqa %xmm1,%xmm3
  paddd  %xmm0,%xmm3
  psubd  %xmm1,%xmm0
  lea    0x0(%r13,%rdi,2),%r9d
  lea    0x0(%rbp,%r14,1),%esi
  mov    %r9d,0x60(%rsp)
  movq   %xmm3,0x38(%rsp)
  movq   %xmm0,0x30(%rsp)
  call   <cook_MULSHIFT32@plt>
  mov    0x60(%rsp),%edi
  mov    %ebp,%esi
  mov    %eax,%r12d
  call   <cook_MULSHIFT32@plt>
  mov    %r14d,%esi
  mov    %r13d,%edi
  sub    %r12d,%eax
  mov    %eax,%ebp
  call   <cook_MULSHIFT32@plt>
  mov    0x10(%rsp),%rdx
  mov    0x8(%rsp),%rcx
  movd   %ebp,%xmm2
  add    %r12d,%eax
  mov    0x10(%rdx),%r13d
  mov    (%rcx,%r15,1),%r12d
  movd   %eax,%xmm5
  mov    %eax,0x60(%rsp)
  mov    0x14(%rdx),%edi
  mov    0x4(%rcx,%r15,1),%r10d
  punpckldq %xmm5,%xmm2
  mov    %rdx,0x20(%rsp)
  mov    %rcx,0x18(%rsp)
  lea    0x0(%r13,%rdi,2),%r11d
  lea    (%r12,%r10,1),%esi
  mov    %r10d,0x8(%rsp)
  movq   %xmm2,0x28(%rsp)
  mov    %r11d,0x10(%rsp)
  call   <cook_MULSHIFT32@plt>
  mov    0x10(%rsp),%edi
  mov    %r12d,%esi
  mov    %eax,%r14d
  call   <cook_MULSHIFT32@plt>
  mov    0x8(%rsp),%esi
  mov    %r13d,%edi
  sub    %r14d,%eax
  mov    %eax,%r12d
  call   <cook_MULSHIFT32@plt>
  movq   0x28(%rsp),%xmm2
  sub    %r12d,%ebp
  movd   %r12d,%xmm1
  add    %r14d,%eax
  movq   0x30(%rsp),%xmm0
  movd   %ebp,%xmm7
  mov    0x18(%rsp),%rcx
  movd   %eax,%xmm6
  sub    0x60(%rsp),%eax
  movq   0x38(%rsp),%xmm3
  punpckldq %xmm6,%xmm1
  movd   %xmm0,%esi
  mov    0x20(%rsp),%rdx
  pshufd $0xe5,%xmm0,%xmm4
  paddd  %xmm2,%xmm1
  movd   %eax,%xmm2
  sub    %eax,%esi
  add    $0x8,%rcx
  punpckldq %xmm7,%xmm2
  movd   %xmm4,%eax
  add    $0x18,%rdx
  paddd  %xmm0,%xmm2
  sub    %ebp,%eax
  movq   %xmm2,-0x8(%rcx,%r15,1)
  movdqa %xmm3,%xmm2
  psubd  %xmm1,%xmm2
  paddd  %xmm3,%xmm1
  movq   %xmm2,-0x8(%rcx)
  mov    %esi,-0x8(%rbx,%r15,1)
  mov    %eax,-0x4(%rbx,%r15,1)
  movq   %xmm1,-0x8(%rbx)
  cmp    0x40(%rsp),%rbx
  jne    L5
  mov    0x48(%rsp),%rbx
  mov    0x58(%rsp),%rcx
  add    0x70(%rsp),%rbx
  add    %rcx,0x40(%rsp)
  subl   $0x1,0x64(%rsp)
  jne    L30
L27:
  mov    0x78(%rsp),%rbx
  shll   $0x2,0x80(%rsp)
  add    %rbx,0x50(%rsp)
  sarl   $0x2,0x84(%rsp)
  jne    L26
L45:
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void R4Core(int *x, int bg, int gp, int *wtab) {
  int ar, ai, br, bi, cr, ci, dr, di, tr, ti;
  int wd, ws, wi;
  int i, j, step;
  int *xptr, *wptr;
  for (; bg != 0; gp <<= 2, bg >>= 2) {
    step = 2 * gp;
    xptr = x;
    for (i = bg; i != 0; i--) {
      wptr = wtab;
      for (j = gp; j != 0; j--) {
        ar = xptr[0];
        ai = xptr[1];
        xptr += step;
        ws = wptr[0];
        wi = wptr[1];
        br = xptr[0];
        bi = xptr[1];
        wd = ws + 2 * wi;
        tr = cook_MULSHIFT32(wi, br + bi);
        br = cook_MULSHIFT32(wd, br) - tr;
        bi = cook_MULSHIFT32(ws, bi) + tr;
        xptr += step;
        ws = wptr[2];
        wi = wptr[3];
        cr = xptr[0];
        ci = xptr[1];
        wd = ws + 2 * wi;
        tr = cook_MULSHIFT32(wi, cr + ci);
        cr = cook_MULSHIFT32(wd, cr) - tr;
        ci = cook_MULSHIFT32(ws, ci) + tr;
        xptr += step;
        ws = wptr[4];
        wi = wptr[5];
        dr = xptr[0];
        di = xptr[1];
        wd = ws + 2 * wi;
        tr = cook_MULSHIFT32(wi, dr + di);
        dr = cook_MULSHIFT32(wd, dr) - tr;
        di = cook_MULSHIFT32(ws, di) + tr;
        wptr += 6;
        tr = ar;
        ti = ai;
        ar = (tr >> 2) - br;
        ai = (ti >> 2) - bi;
        br = (tr >> 2) + br;
        bi = (ti >> 2) + bi;
        tr = cr;
        ti = ci;
        cr = tr + dr;
        ci = di - ti;
        dr = tr - dr;
        di = di + ti;
        xptr[0] = ar + ci;
        xptr[1] = ai + dr;
        xptr -= step;
        xptr[0] = br - cr;
        xptr[1] = bi - di;
        xptr -= step;
        xptr[0] = ar - ci;
        xptr[1] = ai - dr;
        xptr -= step;
        xptr[0] = br + cr;
        xptr[1] = bi + di;
        xptr += 2;
      }
      xptr += 3 * step;
    }
    wtab += 3 * step;
  }
}
```