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

```asm
<idct3>:
  endbr64
  push   %r15
  mov    %rdi,%r10
  mov    %rsi,%r8
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  mov    %rsp,%rcx
  lea    0x80(%rsp),%r11
  mov    %rcx,%rdi
  nopl   0x0(%rax)
L25:
  movswl 0x8(%r10),%ebp
  movswl (%r10),%edx
  movswl 0x4(%r10),%eax
  movswl 0xc(%r10),%ebx
  lea    (%rdx,%rbp,1),%esi
  sub    %ebp,%edx
  movswl 0x6(%r10),%ebp
  imul   $0x187e,%ebx,%r12d
  imul   $0x3b21,%eax,%r9d
  imul   $0xffffc4df,%ebx,%ebx
  imul   $0x187e,%eax,%eax
  imul   $0x2d42,%edx,%edx
  add    %r12d,%r9d
  movswl 0xa(%r10),%r12d
  imul   $0x2d42,%esi,%esi
  sar    $0xe,%r9d
  add    %ebx,%eax
  imul   $0x238f,%r12d,%r15d
  movswl 0xe(%r10),%ebx
  sar    $0xe,%eax
  sar    $0xe,%edx
  lea    (%rax,%rdx,1),%r13d
  sub    %eax,%edx
  movswl 0x2(%r10),%eax
  sar    $0xe,%esi
  lea    (%r9,%rsi,1),%r14d
  sub    %r9d,%esi
  imul   $0x3ec6,%eax,%r9d
  add    %r15d,%r9d
  imul   $0x3537,%ebp,%r15d
  add    %r15d,%r9d
  imul   $0xc7c,%ebx,%r15d
  add    %r15d,%r9d
  sar    $0xe,%r9d
  lea    (%r14,%r9,1),%r15d
  sub    %r9d,%r14d
  mov    %r14w,0xe(%rdi)
  imul   $0x3537,%eax,%r9d
  imul   $0xffffc13a,%r12d,%r14d
  mov    %r15w,(%rdi)
  add    %r14d,%r9d
  imul   $0xfffff384,%ebp,%r14d
  add    %r14d,%r9d
  imul   $0xffffdc71,%ebx,%r14d
  add    %r14d,%r9d
  sar    $0xe,%r9d
  lea    0x0(%r13,%r9,1),%r14d
  sub    %r9d,%r13d
  add    $0x10,%rdi
  add    $0x10,%r10
  imul   $0x238f,%eax,%r9d
  mov    %r13w,-0x4(%rdi)
  imul   $0xc7c,%r12d,%r13d
  mov    %r14w,-0xe(%rdi)
  imul   $0xc7c,%eax,%eax
  imul   $0x3537,%r12d,%r12d
  add    %r13d,%r9d
  imul   $0xffffc13a,%ebp,%r13d
  imul   $0xffffdc71,%ebp,%ebp
  add    %r12d,%eax
  add    %r13d,%r9d
  imul   $0x3537,%ebx,%r13d
  imul   $0xffffc13a,%ebx,%ebx
  add    %ebp,%eax
  add    %r13d,%r9d
  sar    $0xe,%r9d
  add    %ebx,%eax
  lea    (%rdx,%r9,1),%r13d
  sar    $0xe,%eax
  sub    %r9d,%edx
  mov    %dx,-0x6(%rdi)
  lea    (%rsi,%rax,1),%edx
  sub    %eax,%esi
  mov    %r13w,-0xc(%rdi)
  mov    %dx,-0xa(%rdi)
  mov    %si,-0x8(%rdi)
  cmp    %rdi,%r11
  jne    L25
  lea    0x10(%rcx),%r9
  nopl   0x0(%rax,%rax,1)
L13:
  movswl 0x40(%rcx),%r11d
  movswl (%rcx),%edx
  movswl 0x20(%rcx),%eax
  movswl 0x60(%rcx),%r10d
  lea    (%rdx,%r11,1),%esi
  sub    %r11d,%edx
  movswl 0x30(%rcx),%r11d
  imul   $0x187e,%r10d,%ebx
  imul   $0x3b21,%eax,%edi
  imul   $0xffffc4df,%r10d,%r10d
  imul   $0x187e,%eax,%eax
  imul   $0x2d42,%edx,%edx
  add    %ebx,%edi
  movswl 0x50(%rcx),%ebx
  imul   $0x2d42,%esi,%esi
  sar    $0x10,%edi
  add    %r10d,%eax
  imul   $0x238f,%ebx,%r13d
  movswl 0x70(%rcx),%r10d
  sar    $0x10,%eax
  sar    $0x10,%edx
  lea    (%rax,%rdx,1),%ebp
  sub    %eax,%edx
  movswl 0x10(%rcx),%eax
  sar    $0x10,%esi
  lea    (%rdi,%rsi,1),%r12d
  sub    %edi,%esi
  imul   $0x3ec6,%eax,%edi
  add    %r13d,%edi
  imul   $0x3537,%r11d,%r13d
  add    %r13d,%edi
  imul   $0xc7c,%r10d,%r13d
  add    %r13d,%edi
  sar    $0x10,%edi
  lea    (%r12,%rdi,1),%r13d
  sub    %edi,%r12d
  mov    %r12w,0x70(%r8)
  imul   $0x3537,%eax,%edi
  imul   $0xffffc13a,%ebx,%r12d
  mov    %r13w,(%r8)
  add    %r12d,%edi
  imul   $0xfffff384,%r11d,%r12d
  add    %r12d,%edi
  imul   $0xffffdc71,%r10d,%r12d
  add    %r12d,%edi
  sar    $0x10,%edi
  lea    0x0(%rbp,%rdi,1),%r12d
  sub    %edi,%ebp
  add    $0x2,%rcx
  add    $0x2,%r8
  imul   $0x238f,%eax,%edi
  mov    %bp,0x5e(%r8)
  imul   $0xc7c,%ebx,%ebp
  mov    %r12w,0xe(%r8)
  imul   $0xc7c,%eax,%eax
  imul   $0x3537,%ebx,%ebx
  add    %ebp,%edi
  imul   $0xffffc13a,%r11d,%ebp
  imul   $0xffffdc71,%r11d,%r11d
  add    %ebx,%eax
  add    %ebp,%edi
  imul   $0x3537,%r10d,%ebp
  imul   $0xffffc13a,%r10d,%r10d
  add    %r11d,%eax
  add    %ebp,%edi
  sar    $0x10,%edi
  add    %r10d,%eax
  lea    (%rdx,%rdi,1),%ebp
  sar    $0x10,%eax
  sub    %edi,%edx
  mov    %dx,0x4e(%r8)
  lea    (%rsi,%rax,1),%edx
  sub    %eax,%esi
  mov    %bp,0x1e(%r8)
  mov    %dx,0x2e(%r8)
  mov    %si,0x3e(%r8)
  cmp    %rcx,%r9
  jne    L13
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L21
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L21:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void idct3(short data[8][8], short pixel[8][8]) {
  short rows[8][8];
  unsigned i;
  static const short C1 = 16070, C2 = 15137, C3 = 13623, C4 = 11586, C5 = 9103, C6 = 6270, C7 = 3196;
  for (i = 0; i < 8; i++) {
    const short x0 = data[i][0];
    const short x4 = data[i][4];
    const short t0 = C4 * (x0 + x4) >> 14;
    const short t4 = C4 * (x0 - x4) >> 14;
    const short x2 = data[i][2];
    const short x6 = data[i][6];
    const short t2 = (C2 * x2 + C6 * x6) >> 14;
    const short t6 = (C6 * x2 - C2 * x6) >> 14;
    const short e0 = t0 + t2;
    const short e3 = t0 - t2;
    const short e1 = t4 + t6;
    const short e2 = t4 - t6;
    const short x1 = data[i][1];
    const short x3 = data[i][3];
    const short x5 = data[i][5];
    const short x7 = data[i][7];
    const short o0 = (C1 * x1 + C5 * x5 + C3 * x3 + C7 * x7) >> 14;
    const short o1 = (C3 * x1 - C1 * x5 - C7 * x3 - C5 * x7) >> 14;
    const short o2 = (C5 * x1 + C7 * x5 - C1 * x3 + C3 * x7) >> 14;
    const short o3 = (C7 * x1 + C3 * x5 - C5 * x3 - C1 * x7) >> 14;
    rows[i][0] = e0 + o0;
    rows[i][7] = e0 - o0;
    rows[i][1] = e1 + o1;
    rows[i][6] = e1 - o1;
    rows[i][2] = e2 + o2;
    rows[i][5] = e2 - o2;
    rows[i][3] = e3 + o3;
    rows[i][4] = e3 - o3;
  }
  for (i = 0; i < 8; i++) {
    const short x0 = rows[0][i];
    const short x4 = rows[4][i];
    const short t0 = C4 * (x0 + x4) >> 16;
    const short t4 = C4 * (x0 - x4) >> 16;
    const short x2 = rows[2][i];
    const short x6 = rows[6][i];
    const short t2 = (C2 * x2 + C6 * x6) >> 16;
    const short t6 = (C6 * x2 - C2 * x6) >> 16;
    const short e0 = t0 + t2;
    const short e3 = t0 - t2;
    const short e1 = t4 + t6;
    const short e2 = t4 - t6;
    const short x1 = rows[1][i];
    const short x3 = rows[3][i];
    const short x5 = rows[5][i];
    const short x7 = rows[7][i];
    const short o0 = (C1 * x1 + C5 * x5 + C3 * x3 + C7 * x7) >> 16;
    const short o1 = (C3 * x1 - C1 * x5 - C7 * x3 - C5 * x7) >> 16;
    const short o2 = (C5 * x1 + C7 * x5 - C1 * x3 + C3 * x7) >> 16;
    const short o3 = (C7 * x1 + C3 * x5 - C5 * x3 - C1 * x7) >> 16;
    pixel[0][i] = e0 + o0;
    pixel[7][i] = e0 - o0;
    pixel[1][i] = e1 + o1;
    pixel[6][i] = e1 - o1;
    pixel[2][i] = e2 + o2;
    pixel[5][i] = e2 - o2;
    pixel[3][i] = e3 + o3;
    pixel[4][i] = e3 - o3;
  }
}
```