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

```asm
<test_so3ToVec>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  movsd  D62(%rip),%xmm0
  movsd  %xmm0,-0x48(%rbp)
  movsd  D38(%rip),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movsd  D50(%rip),%xmm0
  movsd  %xmm0,-0x38(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  D82(%rip),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  D93(%rip),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  D84(%rip),%xmm0
  movsd  %xmm0,-0x18(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movq   $0x0,-0x70(%rbp)
  movq   $0x0,-0x68(%rbp)
  movq   $0x0,-0x60(%rbp)
  lea    -0x70(%rbp),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <so3ToVec@plt>
  lea    D29(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x0,-0x74(%rbp)
  jmp    L21
L29:
  mov    -0x74(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  add    %rbp,%rax
  sub    $0x40,%rax
  movsd  (%rax),%xmm1
  mov    -0x74(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  add    %rbp,%rax
  sub    $0x48,%rax
  movsd  (%rax),%xmm0
  mov    -0x74(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  add    %rbp,%rax
  sub    $0x50,%rax
  mov    (%rax),%rax
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D73(%rip),%rax
  mov    %rax,%rdi
  mov    $0x3,%eax
  call   <printf@plt>
  addl   $0x1,-0x74(%rbp)
L21:
  cmpl   $0x2,-0x74(%rbp)
  jle    L29
  lea    D18(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movsd  -0x60(%rbp),%xmm1
  movsd  -0x68(%rbp),%xmm0
  mov    -0x70(%rbp),%rax
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D73(%rip),%rax
  mov    %rax,%rdi
  mov    $0x3,%eax
  call   <printf@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L27
  call   <__stack_chk_fail@plt>
L27:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: tag: D62
type_infered: byte[8]
name: unpack_data
arguments: tag: D38
type_infered: byte[8]
name: unpack_data
arguments: tag: D50
type_infered: byte[8]
name: unpack_data
arguments: tag: D82
type_infered: byte[8]
name: unpack_data
arguments: tag: D93
type_infered: byte[8]
name: unpack_data
arguments: tag: D84
type_infered: byte[8]
name: unpack_data
arguments: tag: D29
type_infered: string
name: unpack_data
arguments: tag: D73
type_infered: string
name: unpack_data
arguments: tag: D18
type_infered: string

tool: {"D62": [0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xc0]}

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

tool: {"D50": [0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40]}

tool: {"D82": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xbf]}

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

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

tool: D29: so3:

tool: D73: %lf %lf %lf


tool: D18: omg:

assistant: ```c
void test_so3ToVec() {
  double so3[3][3] = {0, -3, 2, 3, 0, -1, -2, 1, 0};
  double omg[3] = {0};
  int i;
  so3ToVec(so3, omg);
  printf("so3:\n");
  for (i = 0; i < 3; i++) {
    printf("%lf %lf %lf\n", so3[i][0], so3[i][1], so3[i][2]);
  }
  printf("omg:\n");
  printf("%lf %lf %lf\n", omg[0], omg[1], omg[2]);
}
```