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

```asm
<testvMv>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    $0x10,%edi
  call   <malloc@plt>
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movsd  D58(%rip),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  movsd  D10(%rip),%xmm0
  movsd  %xmm0,(%rax)
  mov    $0x10,%edi
  call   <malloc@plt>
  mov    %rax,-0x10(%rbp)
  mov    $0x18,%edi
  call   <malloc@plt>
  mov    %rax,%rdx
  mov    -0x10(%rbp),%rax
  mov    %rdx,(%rax)
  mov    $0x18,%edi
  call   <malloc@plt>
  mov    -0x10(%rbp),%rdx
  add    $0x8,%rdx
  mov    %rax,(%rdx)
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  movsd  D58(%rip),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  add    $0x8,%rax
  movsd  D41(%rip),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  add    $0x10,%rax
  movsd  D12(%rip),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  movsd  D60(%rip),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  add    $0x8,%rax
  movsd  D23(%rip),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  add    $0x10,%rax
  movsd  D69(%rip),%xmm0
  movsd  %xmm0,(%rax)
  mov    $0x18,%edi
  call   <malloc@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rcx
  mov    -0x10(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    $0x3,%r8d
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <vMv@plt>
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D53(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x0,%eax
  call   <getchar@plt>
  nop
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D58
type_infered: byte[8]
name: extract_symbolic_data
arguments: tag: D10
type_infered: byte[8]
name: extract_symbolic_data
arguments: tag: D41
type_infered: f64
name: extract_symbolic_data
arguments: tag: D12
type_infered: f64
name: extract_symbolic_data
arguments: tag: D60
type_infered: f64
name: extract_symbolic_data
arguments: tag: D23
type_infered: f64
name: extract_symbolic_data
arguments: tag: D69
type_infered: byte[8]
name: extract_symbolic_data
arguments: tag: D53
type_infered: string

tool: {"D58": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

tool: {"D10": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40]}

tool: D41: 0.5

tool: D12: 0.2

tool: D60: 0.3

tool: D23: 0.4

tool: {"D69": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0]}

tool: D53: %lf %lf %lf

assistant: ```c
void testvMv() {
  double *v1 = (double *)malloc(sizeof(double) * 2);
  v1[0] = 1;
  v1[1] = 2;
  double **M = (double **)malloc(sizeof(double *) * 2);
  M[0] = (double *)malloc(sizeof(double) * 3);
  M[1] = (double *)malloc(sizeof(double) * 3);
  M[0][0] = 1;
  M[0][1] = 0.5;
  M[0][2] = 0.2;
  M[1][0] = 0.3;
  M[1][1] = 0.4;
  M[1][2] = -2;
  double *v2 = (double *)malloc(sizeof(double) * 3);
  vMv(v1, 2, M, v2, 3);
  printf("%lf %lf %lf", v2[0], v2[1], v2[2]);
  getchar();
}
```