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

```asm
<fdct_int32>:
  endbr64
  push   %r14
  mov    %rdi,%r8
  mov    %rdi,%r10
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x110,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x108(%rsp)
  xor    %eax,%eax
  mov    %rsp,%r9
  lea    0x100(%rsp),%rbx
  mov    %r9,%rax
  nopw   0x0(%rax,%rax,1)
L17:
  movswl 0xe(%r10),%ecx
  movswl (%r10),%edx
  movswl 0xc(%r10),%esi
  movswl 0xa(%r10),%edi
  lea    (%rdx,%rcx,1),%ebp
  sub    %ecx,%edx
  movswl 0x2(%r10),%ecx
  movswl 0x8(%r10),%r12d
  lea    (%rcx,%rsi,1),%r11d
  sub    %esi,%ecx
  movswl 0x4(%r10),%esi
  lea    (%rsi,%rdi,1),%r13d
  sub    %edi,%esi
  movswl 0x6(%r10),%edi
  lea    (%rdi,%r12,1),%r14d
  sub    %r12d,%edi
  lea    0x0(%rbp,%r14,1),%r12d
  sub    %r14d,%ebp
  lea    (%r11,%r13,1),%r14d
  sub    %r13d,%r11d
  lea    (%r12,%r14,1),%r13d
  sub    %r14d,%r12d
  lea    (%rdx,%rsi,1),%r14d
  shl    $0x2,%r12d
  shl    $0x2,%r13d
  mov    %r12d,0x10(%rax)
  lea    0x0(%rbp,%r11,1),%r12d
  imul   $0x1151,%r12d,%r12d
  mov    %r13d,(%rax)
  lea    (%rcx,%rsi,1),%r13d
  imul   $0x187e,%ebp,%ebp
  imul   $0xffffc4df,%r11d,%r11d
  imul   $0xffffadfd,%r13d,%r13d
  imul   $0x41b3,%esi,%esi
  lea    0x400(%r12,%rbp,1),%ebp
  lea    0x400(%r12,%r11,1),%r11d
  sar    $0xb,%ebp
  lea    (%rcx,%rdi,1),%r12d
  sar    $0xb,%r11d
  mov    %ebp,0x8(%rax)
  imul   $0x6254,%ecx,%ecx
  lea    (%rdx,%rdi,1),%ebp
  mov    %r11d,0x18(%rax)
  lea    (%r12,%r14,1),%r11d
  add    %r13d,%esi
  imul   $0x25a1,%r11d,%r11d
  imul   $0xffffe333,%ebp,%ebp
  add    %r13d,%ecx
  imul   $0xffffc13b,%r12d,%r12d
  imul   $0xfffff384,%r14d,%r14d
  imul   $0x98e,%edi,%edi
  imul   $0x300b,%edx,%edx
  add    %r11d,%r12d
  add    %r14d,%r11d
  lea    0x400(%r12,%rcx,1),%ecx
  add    %ebp,%edi
  lea    0x400(%r11,%rsi,1),%esi
  sar    $0xb,%ecx
  add    %ebp,%edx
  lea    0x400(%r12,%rdi,1),%edi
  sar    $0xb,%esi
  mov    %ecx,0xc(%rax)
  lea    0x400(%r11,%rdx,1),%edx
  sar    $0xb,%edi
  mov    %esi,0x14(%rax)
  sar    $0xb,%edx
  mov    %edi,0x1c(%rax)
  add    $0x20,%rax
  add    $0x10,%r10
  mov    %edx,-0x1c(%rax)
  cmp    %rbx,%rax
  jne    L17
  mov    %r9,%rax
  lea    0x20(%rsp),%r10
  nopl   0x0(%rax)
L31:
  mov    (%rax),%edx
  mov    0x20(%rax),%ecx
  mov    0x40(%rax),%esi
  mov    0x60(%rax),%ebp
  mov    0xe0(%rax),%ebx
  mov    0xc0(%rax),%r11d
  mov    0xa0(%rax),%r12d
  mov    0x80(%rax),%r13d
  add    %edx,%ebx
  add    %ecx,%r11d
  sub    0xe0(%rax),%edx
  sub    0xc0(%rax),%ecx
  add    %esi,%r12d
  add    %ebp,%r13d
  sub    0x80(%rax),%ebp
  sub    0xa0(%rax),%esi
  lea    (%rbx,%r13,1),%edi
  sub    %r13d,%ebx
  lea    (%r11,%r12,1),%r13d
  sub    %r12d,%r11d
  lea    0x2(%rdi,%r13,1),%r12d
  sub    %r13d,%edi
  lea    (%rdx,%rsi,1),%r13d
  add    $0x2,%edi
  sar    $0x2,%r12d
  sar    $0x2,%edi
  mov    %r12d,(%rax)
  lea    (%rcx,%rsi,1),%r12d
  mov    %edi,0x80(%rax)
  imul   $0x41b3,%esi,%esi
  lea    (%rbx,%r11,1),%edi
  imul   $0x1151,%edi,%edi
  imul   $0xffffc4df,%r11d,%r11d
  imul   $0x187e,%ebx,%ebx
  imul   $0xffffadfd,%r12d,%r12d
  lea    0x4000(%rdi,%rbx,1),%ebx
  lea    0x4000(%rdi,%r11,1),%edi
  sar    $0xf,%edi
  sar    $0xf,%ebx
  add    %r12d,%esi
  mov    %edi,0xc0(%rax)
  lea    (%rcx,%rbp,1),%edi
  lea    (%rdi,%r13,1),%r11d
  mov    %ebx,0x40(%rax)
  lea    (%rdx,%rbp,1),%ebx
  imul   $0x25a1,%r11d,%r11d
  imul   $0xffffe333,%ebx,%ebx
  imul   $0xffffc13b,%edi,%edi
  imul   $0xfffff384,%r13d,%r13d
  imul   $0x98e,%ebp,%ebp
  add    %r11d,%edi
  add    %r13d,%r11d
  add    %ebx,%ebp
  lea    0x4000(%r11,%rsi,1),%esi
  lea    0x4000(%rdi,%rbp,1),%ebp
  sar    $0xf,%esi
  sar    $0xf,%ebp
  imul   $0x6254,%ecx,%ecx
  mov    %esi,0xa0(%rax)
  add    $0x4,%rax
  imul   $0x300b,%edx,%edx
  mov    %ebp,0xdc(%rax)
  add    %r12d,%ecx
  add    %ebx,%edx
  lea    0x4000(%rdi,%rcx,1),%ecx
  lea    0x4000(%r11,%rdx,1),%edx
  sar    $0xf,%ecx
  sar    $0xf,%edx
  mov    %ecx,0x5c(%rax)
  mov    %edx,0x1c(%rax)
  cmp    %r10,%rax
  jne    L31
  xor    %edx,%edx
  nopl   (%rax)
L30:
  mov    (%r9,%rdx,4),%eax
  add    $0x4,%eax
  sar    $0x3,%eax
  mov    %ax,(%r8,%rdx,2)
  add    $0x1,%rdx
  cmp    $0x40,%rdx
  jne    L30
  mov    0x108(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L38
  add    $0x110,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L38:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void fdct_int32(short *const block) {
  int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
  int tmp10, tmp11, tmp12, tmp13;
  int z1, z2, z3, z4, z5;
  short *blkptr;
  int *dataptr;
  int data[64];
  int i;
  dataptr = data;
  blkptr = block;
  for (i = 0; i < 8; i++) {
    tmp0 = blkptr[0] + blkptr[7];
    tmp7 = blkptr[0] - blkptr[7];
    tmp1 = blkptr[1] + blkptr[6];
    tmp6 = blkptr[1] - blkptr[6];
    tmp2 = blkptr[2] + blkptr[5];
    tmp5 = blkptr[2] - blkptr[5];
    tmp3 = blkptr[3] + blkptr[4];
    tmp4 = blkptr[3] - blkptr[4];
    tmp10 = tmp0 + tmp3;
    tmp13 = tmp0 - tmp3;
    tmp11 = tmp1 + tmp2;
    tmp12 = tmp1 - tmp2;
    dataptr[0] = (tmp10 + tmp11) << 2;
    dataptr[4] = (tmp10 - tmp11) << 2;
    z1 = (tmp12 + tmp13) * ((int)4433);
    dataptr[2] = (((z1 + tmp13 * ((int)6270)) + (((int)1) << ((13 - 2) - 1))) >> (13 - 2));
    dataptr[6] = (((z1 + tmp12 * (-((int)15137))) + (((int)1) << ((13 - 2) - 1))) >> (13 - 2));
    z1 = tmp4 + tmp7;
    z2 = tmp5 + tmp6;
    z3 = tmp4 + tmp6;
    z4 = tmp5 + tmp7;
    z5 = (z3 + z4) * ((int)9633);
    tmp4 *= ((int)2446);
    tmp5 *= ((int)16819);
    tmp6 *= ((int)25172);
    tmp7 *= ((int)12299);
    z1 *= -((int)7373);
    z2 *= -((int)20995);
    z3 *= -((int)16069);
    z4 *= -((int)3196);
    z3 += z5;
    z4 += z5;
    dataptr[7] = (((tmp4 + z1 + z3) + (((int)1) << ((13 - 2) - 1))) >> (13 - 2));
    dataptr[5] = (((tmp5 + z2 + z4) + (((int)1) << ((13 - 2) - 1))) >> (13 - 2));
    dataptr[3] = (((tmp6 + z2 + z3) + (((int)1) << ((13 - 2) - 1))) >> (13 - 2));
    dataptr[1] = (((tmp7 + z1 + z4) + (((int)1) << ((13 - 2) - 1))) >> (13 - 2));
    dataptr += 8;
    blkptr += 8;
  }
  dataptr = data;
  for (i = 0; i < 8; i++) {
    tmp0 = dataptr[0] + dataptr[56];
    tmp7 = dataptr[0] - dataptr[56];
    tmp1 = dataptr[8] + dataptr[48];
    tmp6 = dataptr[8] - dataptr[48];
    tmp2 = dataptr[16] + dataptr[40];
    tmp5 = dataptr[16] - dataptr[40];
    tmp3 = dataptr[24] + dataptr[32];
    tmp4 = dataptr[24] - dataptr[32];
    tmp10 = tmp0 + tmp3;
    tmp13 = tmp0 - tmp3;
    tmp11 = tmp1 + tmp2;
    tmp12 = tmp1 - tmp2;
    dataptr[0] = (((tmp10 + tmp11) + (((int)1) << ((2) - 1))) >> (2));
    dataptr[32] = (((tmp10 - tmp11) + (((int)1) << ((2) - 1))) >> (2));
    z1 = (tmp12 + tmp13) * ((int)4433);
    dataptr[16] = (((z1 + tmp13 * ((int)6270)) + (((int)1) << ((13 + 2) - 1))) >> (13 + 2));
    dataptr[48] = (((z1 + tmp12 * (-((int)15137))) + (((int)1) << ((13 + 2) - 1))) >> (13 + 2));
    z1 = tmp4 + tmp7;
    z2 = tmp5 + tmp6;
    z3 = tmp4 + tmp6;
    z4 = tmp5 + tmp7;
    z5 = (z3 + z4) * ((int)9633);
    tmp4 *= ((int)2446);
    tmp5 *= ((int)16819);
    tmp6 *= ((int)25172);
    tmp7 *= ((int)12299);
    z1 *= -((int)7373);
    z2 *= -((int)20995);
    z3 *= -((int)16069);
    z4 *= -((int)3196);
    z3 += z5;
    z4 += z5;
    dataptr[56] = (((tmp4 + z1 + z3) + (((int)1) << ((13 + 2) - 1))) >> (13 + 2));
    dataptr[40] = (((tmp5 + z2 + z4) + (((int)1) << ((13 + 2) - 1))) >> (13 + 2));
    dataptr[24] = (((tmp6 + z2 + z3) + (((int)1) << ((13 + 2) - 1))) >> (13 + 2));
    dataptr[8] = (((tmp7 + z1 + z4) + (((int)1) << ((13 + 2) - 1))) >> (13 + 2));
    dataptr++;
  }
  for (i = 0; i < 64; i++)
    block[i] = (short int)(((data[i]) + (((int)1) << ((3) - 1))) >> (3));
}
```