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

```asm
<ReferenceDct>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  sub    $0x410,%rsp
  movdqu (%rdi),%xmm3
  movdqu 0x10(%rdi),%xmm4
  cvtdq2pd (%rdi),%xmm0
  mov    %fs:0x28,%rax
  mov    %rax,0x408(%rsp)
  xor    %eax,%eax
  movdqu 0x20(%rdi),%xmm5
  movaps %xmm0,(%rsp)
  movdqu 0x30(%rdi),%xmm6
  pshufd $0xee,%xmm3,%xmm0
  movdqu 0x40(%rdi),%xmm7
  movdqu 0x50(%rdi),%xmm3
  mov    %rsp,%rbx
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x10(%rsp)
  cvtdq2pd 0x10(%rdi),%xmm0
  mov    %rbx,%r13
  movaps %xmm0,0x20(%rsp)
  pshufd $0xee,%xmm4,%xmm0
  lea    0x200(%rsp),%r12
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x30(%rsp)
  cvtdq2pd 0x20(%rdi),%xmm0
  mov    %r12,%r14
  movaps %xmm0,0x40(%rsp)
  pshufd $0xee,%xmm5,%xmm0
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x50(%rsp)
  cvtdq2pd 0x30(%rdi),%xmm0
  movaps %xmm0,0x60(%rsp)
  pshufd $0xee,%xmm6,%xmm0
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x70(%rsp)
  cvtdq2pd 0x40(%rdi),%xmm0
  movaps %xmm0,0x80(%rsp)
  pshufd $0xee,%xmm7,%xmm0
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x90(%rsp)
  cvtdq2pd 0x50(%rdi),%xmm0
  movaps %xmm0,0xa0(%rsp)
  pshufd $0xee,%xmm3,%xmm0
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0xb0(%rsp)
  cvtdq2pd 0x60(%rdi),%xmm0
  movdqu 0x60(%rdi),%xmm4
  movdqu 0x70(%rdi),%xmm5
  movdqu 0x80(%rdi),%xmm6
  movaps %xmm0,0xc0(%rsp)
  pshufd $0xee,%xmm4,%xmm0
  movdqu 0x90(%rdi),%xmm7
  movdqu 0xa0(%rdi),%xmm3
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0xd0(%rsp)
  cvtdq2pd 0x70(%rdi),%xmm0
  movdqu 0xb0(%rdi),%xmm4
  movaps %xmm0,0xe0(%rsp)
  pshufd $0xee,%xmm5,%xmm0
  movdqu 0xc0(%rdi),%xmm5
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0xf0(%rsp)
  cvtdq2pd 0x80(%rdi),%xmm0
  movaps %xmm0,0x100(%rsp)
  pshufd $0xee,%xmm6,%xmm0
  movdqu 0xd0(%rdi),%xmm6
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x110(%rsp)
  cvtdq2pd 0x90(%rdi),%xmm0
  movaps %xmm0,0x120(%rsp)
  pshufd $0xee,%xmm7,%xmm0
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x130(%rsp)
  cvtdq2pd 0xa0(%rdi),%xmm0
  movaps %xmm0,0x140(%rsp)
  pshufd $0xee,%xmm3,%xmm0
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x150(%rsp)
  cvtdq2pd 0xb0(%rdi),%xmm0
  movaps %xmm0,0x160(%rsp)
  pshufd $0xee,%xmm4,%xmm0
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x170(%rsp)
  cvtdq2pd 0xc0(%rdi),%xmm0
  movaps %xmm0,0x180(%rsp)
  pshufd $0xee,%xmm5,%xmm0
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x190(%rsp)
  cvtdq2pd 0xd0(%rdi),%xmm0
  movaps %xmm0,0x1a0(%rsp)
  pshufd $0xee,%xmm6,%xmm0
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x1b0(%rsp)
  cvtdq2pd 0xe0(%rdi),%xmm0
  movdqu 0xe0(%rdi),%xmm7
  movaps %xmm0,0x1c0(%rsp)
  pshufd $0xee,%xmm7,%xmm0
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x1d0(%rsp)
  movdqu 0xf0(%rdi),%xmm0
  cvtdq2pd %xmm0,%xmm1
  pshufd $0xee,%xmm0,%xmm0
  movaps %xmm1,0x1e0(%rsp)
  cvtdq2pd %xmm0,%xmm0
  movaps %xmm0,0x1f0(%rsp)
  nopl   0x0(%rax,%rax,1)
L43:
  mov    %r14,%rsi
  mov    %r13,%rdi
  add    $0x40,%r13
  add    $0x40,%r14
  call   <DoubleReferenceDct1D@plt>
  cmp    %r12,%r13
  jne    L43
  mov    %rbx,%rsi
  mov    %r12,%rdi
  mov    %r12,%r14
  mov    %rbx,%r13
  call   <DoubleTransposeMatrix@plt>
  nopl   0x0(%rax)
L17:
  mov    %r14,%rsi
  mov    %r13,%rdi
  add    $0x40,%r13
  add    $0x40,%r14
  call   <DoubleReferenceDct1D@plt>
  cmp    %r12,%r13
  jne    L17
  mov    %rbx,%rsi
  mov    %r12,%rdi
  call   <DoubleTransposeMatrix@plt>
  movsd  D2(%rip),%xmm2
  mov    %rbx,%rax
  pxor   %xmm1,%xmm1
  jmp    L34
  nopl   0x0(%rax)
L44:
  addsd  %xmm2,%xmm0
  add    $0x8,%rax
  cvttsd2si %xmm0,%edx
  mov    %edx,-0x4(%rbp)
  cmp    %r12,%rax
  je     L45
L34:
  movsd  (%rax),%xmm0
  add    $0x4,%rbp
  comisd %xmm1,%xmm0
  ja     L44
  subsd  %xmm2,%xmm0
  add    $0x8,%rax
  cvttsd2si %xmm0,%edx
  mov    %edx,-0x4(%rbp)
  cmp    %r12,%rax
  jne    L34
L45:
  mov    0x408(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L50
  add    $0x410,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L50:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: tag: D2
type_infered: f64

tool: D2: 0.5

assistant: ```c
void ReferenceDct(int *matrix, int *newmatrix) {
  static char RoutineName[] = "ReferenceDct";
  int *mptr;
  double *sptr, *dptr;
  double sourcematrix[64], destmatrix[64];
  for (sptr = sourcematrix, mptr = matrix; mptr < matrix + 64; mptr++) {
    *(sptr++) = (double)*mptr;
  }
  for (dptr = destmatrix, sptr = sourcematrix; sptr < sourcematrix + 64; sptr += 8) {
    DoubleReferenceDct1D(sptr, dptr);
    dptr += 8;
  }
  DoubleTransposeMatrix(destmatrix, sourcematrix);
  for (dptr = destmatrix, sptr = sourcematrix; sptr < sourcematrix + 64; sptr += 8) {
    DoubleReferenceDct1D(sptr, dptr);
    dptr += 8;
  }
  DoubleTransposeMatrix(destmatrix, sourcematrix);
  for (sptr = sourcematrix, mptr = newmatrix; mptr < newmatrix + 64; sptr++) {
    *(mptr++) = (int)(*sptr > 0 ? (*(sptr) + 0.5) : (*(sptr)-0.5));
  }
}
```