user: 下面的汇编指令对应的C源代码是什么:

```asm
<R8FirstPass>:
  endbr64
  test   %esi,%esi
  je     L3
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,%r12
  mov    %esi,%esi
  shl    $0x6,%rsi
  lea    (%rdi,%rsi,1),%rax
  mov    %rax,0x18(%rsp)
L5:
  mov    (%r12),%r8d
  mov    %r8d,%edx
  add    0x8(%r12),%edx
  sub    0x8(%r12),%r8d
  mov    0x4(%r12),%esi
  mov    %esi,%eax
  add    0xc(%r12),%eax
  sub    0xc(%r12),%esi
  mov    0x10(%r12),%ecx
  mov    %ecx,%r11d
  add    0x18(%r12),%r11d
  sub    0x18(%r12),%ecx
  mov    0x14(%r12),%edi
  mov    %edi,%r10d
  add    0x1c(%r12),%r10d
  sub    0x1c(%r12),%edi
  mov    %r8d,%ebx
  sub    %edi,%ebx
  mov    %ebx,0x8(%rsp)
  add    %r8d,%edi
  mov    %edi,0xc(%rsp)
  lea    (%rsi,%rcx,1),%r15d
  mov    %r15d,0x10(%rsp)
  sub    %ecx,%esi
  mov    %esi,0x14(%rsp)
  mov    0x20(%r12),%ebx
  mov    %ebx,%ecx
  add    0x28(%r12),%ecx
  sub    0x28(%r12),%ebx
  mov    0x24(%r12),%ebp
  mov    %ebp,%r14d
  add    0x2c(%r12),%r14d
  mov    %r14d,%edi
  sub    0x2c(%r12),%ebp
  mov    0x30(%r12),%r8d
  mov    %r8d,%esi
  add    0x38(%r12),%esi
  sub    0x38(%r12),%r8d
  mov    %r8d,%r15d
  mov    0x34(%r12),%r9d
  mov    %r9d,%r8d
  add    0x3c(%r12),%r8d
  sub    0x3c(%r12),%r9d
  mov    %r9d,%r14d
  lea    (%rcx,%rsi,1),%r9d
  sar    %r9d
  sub    %esi,%ecx
  sar    %ecx
  lea    (%rdi,%r8,1),%esi
  sar    %esi
  sub    %r8d,%edi
  sar    %edi
  lea    (%rdx,%r11,1),%r8d
  sar    %r8d
  lea    (%r8,%r9,1),%r13d
  mov    %r13d,(%r12)
  sub    %r9d,%r8d
  mov    %r8d,0x20(%r12)
  lea    (%rax,%r10,1),%r8d
  sar    %r8d
  lea    (%r8,%rsi,1),%r9d
  mov    %r9d,0x4(%r12)
  sub    %esi,%r8d
  mov    %r8d,0x24(%r12)
  sub    %r11d,%edx
  sar    %edx
  lea    (%rdx,%rdi,1),%esi
  mov    %esi,0x10(%r12)
  sub    %edi,%edx
  mov    %edx,0x30(%r12)
  sub    %r10d,%eax
  sar    %eax
  mov    %eax,%edx
  sub    %ecx,%edx
  mov    %edx,0x14(%r12)
  add    %ecx,%eax
  mov    %eax,0x34(%r12)
  mov    %ebx,%r13d
  sub    %r14d,%r13d
  add    %r14d,%ebx
  lea    0x0(%rbp,%r15,1),%r14d
  sub    %r15d,%ebp
  mov    %r13d,%edx
  sub    %r14d,%edx
  mov    %edx,%esi
  mov    $0x5a82799a,%edi
  mov    $0x0,%eax
  call   <cook_MULSHIFT32@plt>
  mov    %eax,%r15d
  lea    0x0(%r13,%r14,1),%esi
  mov    $0x5a82799a,%edi
  mov    $0x0,%eax
  call   <cook_MULSHIFT32@plt>
  mov    %eax,%r14d
  mov    %ebx,%ecx
  sub    %ebp,%ecx
  mov    %ecx,%esi
  mov    $0x5a82799a,%edi
  mov    $0x0,%eax
  call   <cook_MULSHIFT32@plt>
  mov    %eax,%r13d
  lea    (%rbx,%rbp,1),%esi
  mov    $0x5a82799a,%edi
  mov    $0x0,%eax
  call   <cook_MULSHIFT32@plt>
  mov    %eax,%edx
  mov    0x8(%rsp),%eax
  sar    %eax
  mov    %eax,%ecx
  sub    %r15d,%ecx
  mov    %ecx,0x18(%r12)
  add    %r15d,%eax
  mov    %eax,0x38(%r12)
  mov    0x10(%rsp),%r15d
  sar    %r15d
  mov    %r15d,%eax
  mov    %r15d,%ecx
  sub    %r14d,%ecx
  mov    %ecx,0x1c(%r12)
  add    %r14d,%eax
  mov    %eax,0x3c(%r12)
  mov    0xc(%rsp),%edi
  sar    %edi
  mov    %edi,%eax
  lea    (%rdi,%rdx,1),%ecx
  mov    %ecx,0x8(%r12)
  sub    %edx,%eax
  mov    %eax,0x28(%r12)
  mov    0x14(%rsp),%eax
  sar    %eax
  mov    %eax,%edx
  sub    %r13d,%edx
  mov    %edx,0xc(%r12)
  add    %r13d,%eax
  mov    %eax,0x2c(%r12)
  add    $0x40,%r12
  cmp    0x18(%rsp),%r12
  jne    L5
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L3:
  ret
```

assistant: ```c
void R8FirstPass(int *x, int bg) {
  int ar, ai, br, bi, cr, ci, dr, di;
  int sr, si, tr, ti, ur, ui, vr, vi;
  int wr, wi, xr, xi, yr, yi, zr, zi;
  for (; bg != 0; bg--) {
    ar = x[0] + x[2];
    br = x[0] - x[2];
    ai = x[1] + x[3];
    bi = x[1] - x[3];
    cr = x[4] + x[6];
    dr = x[4] - x[6];
    ci = x[5] + x[7];
    di = x[5] - x[7];
    sr = ar + cr;
    ur = ar - cr;
    si = ai + ci;
    ui = ai - ci;
    tr = br - di;
    vr = br + di;
    ti = bi + dr;
    vi = bi - dr;
    ar = x[8] + x[10];
    br = x[8] - x[10];
    ai = x[9] + x[11];
    bi = x[9] - x[11];
    cr = x[12] + x[14];
    dr = x[12] - x[14];
    ci = x[13] + x[15];
    di = x[13] - x[15];
    wr = (ar + cr) >> 1;
    yr = (ar - cr) >> 1;
    wi = (ai + ci) >> 1;
    yi = (ai - ci) >> 1;
    x[0] = (sr >> 1) + wr;
    x[8] = (sr >> 1) - wr;
    x[1] = (si >> 1) + wi;
    x[9] = (si >> 1) - wi;
    x[4] = (ur >> 1) + yi;
    x[12] = (ur >> 1) - yi;
    x[5] = (ui >> 1) - yr;
    x[13] = (ui >> 1) + yr;
    ar = br - di;
    cr = br + di;
    ai = bi + dr;
    ci = bi - dr;
    xr = cook_MULSHIFT32(1518500250, ar - ai);
    xi = cook_MULSHIFT32(1518500250, ar + ai);
    zr = cook_MULSHIFT32(1518500250, cr - ci);
    zi = cook_MULSHIFT32(1518500250, cr + ci);
    x[6] = (tr >> 1) - xr;
    x[14] = (tr >> 1) + xr;
    x[7] = (ti >> 1) - xi;
    x[15] = (ti >> 1) + xi;
    x[2] = (vr >> 1) + zi;
    x[10] = (vr >> 1) - zi;
    x[3] = (vi >> 1) - zr;
    x[11] = (vi >> 1) + zr;
    x += 16;
  }
}
```