user: Translate the below assembly code into C programming language:

```asm
<test_RotInv>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xb0,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0xa0(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x98(%rbp)
  movsd  D22(%rip),%xmm0
  movsd  %xmm0,-0x90(%rbp)
  movsd  D22(%rip),%xmm0
  movsd  %xmm0,-0x88(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x80(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x78(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x70(%rbp)
  movsd  D22(%rip),%xmm0
  movsd  %xmm0,-0x68(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  movq   $0x0,-0x50(%rbp)
  movq   $0x0,-0x48(%rbp)
  movq   $0x0,-0x40(%rbp)
  movq   $0x0,-0x38(%rbp)
  movq   $0x0,-0x30(%rbp)
  movq   $0x0,-0x28(%rbp)
  movq   $0x0,-0x20(%rbp)
  movq   $0x0,-0x18(%rbp)
  movq   $0x0,-0x10(%rbp)
  lea    -0x50(%rbp),%rdx
  lea    -0xa0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <RotInv@plt>
  lea    D50(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x0,-0xa4(%rbp)
  jmp    L0
L3:
  mov    -0xa4(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  add    %rbp,%rax
  sub    $0x90,%rax
  movsd  (%rax),%xmm1
  mov    -0xa4(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  add    %rbp,%rax
  sub    $0x98,%rax
  movsd  (%rax),%xmm0
  mov    -0xa4(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  add    %rbp,%rax
  sub    $0xa0,%rax
  mov    (%rax),%rax
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D16(%rip),%rax
  mov    %rax,%rdi
  mov    $0x3,%eax
  call   <printf@plt>
  addl   $0x1,-0xa4(%rbp)
L0:
  cmpl   $0x2,-0xa4(%rbp)
  jle    L3
  lea    D10(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x0,-0xa4(%rbp)
  jmp    L4
L18:
  mov    -0xa4(%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    -0xa4(%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    -0xa4(%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    D16(%rip),%rax
  mov    %rax,%rdi
  mov    $0x3,%eax
  call   <printf@plt>
  addl   $0x1,-0xa4(%rbp)
L4:
  cmpl   $0x2,-0xa4(%rbp)
  jle    L18
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L30
  call   <__stack_chk_fail@plt>
L30:
  leave
  ret
```

tool_calls: name: read_data
arguments: tag: D22
data_type: byte[8]
name: read_data
arguments: tag: D50
data_type: string
name: read_data
arguments: tag: D16
data_type: string
name: read_data
arguments: tag: D10
data_type: string

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

tool: D50: R:

tool: D16: %lf %lf %lf


tool: D10: InvR:

assistant: ```c
void test_RotInv() {
  double R[3][3] = {0, 0, 1, 1, 0, 0, 0, 1, 0};
  double InvR[3][3] = {{0}};
  RotInv(R, InvR);
  int i;
  printf("R:\n");
  for (i = 0; i < 3; i++) {
    printf("%lf %lf %lf\n", R[i][0], R[i][1], R[i][2]);
  }
  printf("InvR:\n");
  for (i = 0; i < 3; i++) {
    printf("%lf %lf %lf\n", InvR[i][0], InvR[i][1], InvR[i][2]);
  }
}
```