user: What is the c source code of the assembly code below?

```asm
<eigen_decomposition>:
  endbr64
  push   %r13
  push   %r12
  mov    %rdx,%r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  call   <fast_eigen3x3@plt>
  test   %rax,%rax
  jne    L6
  xor    %eax,%eax
L5:
  movsd  0x0(%rbp,%rax,1),%xmm0
  movsd  %xmm0,(%rbx,%rax,1)
  movsd  0x8(%rbp,%rax,1),%xmm0
  movsd  %xmm0,0x8(%rbx,%rax,1)
  movsd  0x10(%rbp,%rax,1),%xmm0
  movsd  %xmm0,0x10(%rbx,%rax,1)
  add    $0x18,%rax
  cmp    $0x48,%rax
  jne    L5
  mov    %rsp,%r13
  mov    %r12,%rsi
  mov    %rbx,%rdi
  mov    %r13,%rdx
  call   <tred2@plt>
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <tql2@plt>
  movsd  (%r12),%xmm4
  movq   D6(%rip),%xmm0
  movsd  0x8(%r12),%xmm5
  movsd  0x10(%r12),%xmm3
  movapd %xmm4,%xmm1
  movapd %xmm4,%xmm7
  xorpd  %xmm0,%xmm1
  movapd %xmm5,%xmm2
  movapd %xmm5,%xmm6
  xorpd  %xmm0,%xmm2
  maxsd  %xmm1,%xmm7
  xorpd  %xmm3,%xmm0
  maxsd  %xmm2,%xmm6
  movapd %xmm7,%xmm1
  movapd %xmm3,%xmm7
  maxsd  %xmm0,%xmm7
  comisd %xmm6,%xmm1
  movapd %xmm6,%xmm2
  movapd %xmm7,%xmm0
  jae    L91
L22:
  comisd %xmm1,%xmm2
  jb     L94
  comisd %xmm0,%xmm2
  ja     L98
  nopl   0x0(%rax)
L94:
  comisd %xmm2,%xmm1
  jbe    L6
  movsd  (%r12),%xmm4
  movsd  0x8(%r12),%xmm3
  movsd  0x8(%rbx),%xmm2
  movsd  0x20(%rbx),%xmm1
  movsd  0x38(%rbx),%xmm0
  movsd  %xmm4,0x8(%r12)
  movsd  (%rbx),%xmm4
  movsd  %xmm4,0x8(%rbx)
  movsd  0x18(%rbx),%xmm4
  movsd  %xmm4,0x20(%rbx)
  movsd  0x30(%rbx),%xmm4
  movsd  %xmm4,0x38(%rbx)
  movsd  %xmm3,(%r12)
  movsd  %xmm2,(%rbx)
  movsd  %xmm1,0x18(%rbx)
  movsd  %xmm0,0x30(%rbx)
L6:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L17
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax)
L91:
  comisd %xmm7,%xmm1
  jbe    L22
  movsd  0x40(%rbx),%xmm1
  movsd  0x10(%rbx),%xmm6
  movsd  0x28(%rbx),%xmm5
  movsd  %xmm4,0x10(%r12)
  movsd  (%rbx),%xmm4
  movsd  %xmm4,0x10(%rbx)
  movsd  0x18(%rbx),%xmm4
  movsd  %xmm4,0x28(%rbx)
  movsd  0x30(%rbx),%xmm4
  movsd  %xmm4,0x40(%rbx)
  movsd  %xmm3,(%r12)
  movsd  %xmm1,0x30(%rbx)
  movapd %xmm7,%xmm1
  movsd  %xmm6,(%rbx)
  movsd  %xmm5,0x18(%rbx)
  jmp    L94
  nopw   0x0(%rax,%rax,1)
L98:
  movsd  0x40(%rbx),%xmm2
  movsd  0x10(%rbx),%xmm6
  movsd  0x28(%rbx),%xmm4
  movsd  %xmm5,0x10(%r12)
  movsd  0x8(%rbx),%xmm5
  movsd  %xmm5,0x10(%rbx)
  movsd  0x20(%rbx),%xmm5
  movsd  %xmm5,0x28(%rbx)
  movsd  0x38(%rbx),%xmm5
  movsd  %xmm5,0x40(%rbx)
  movsd  %xmm3,0x8(%r12)
  movsd  %xmm2,0x38(%rbx)
  movapd %xmm0,%xmm2
  movsd  %xmm6,0x8(%rbx)
  movsd  %xmm4,0x20(%rbx)
  jmp    L94
L17:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D6
type_infered: byte[8]

tool: {"D6": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80]}

assistant: ```c
void eigen_decomposition(double A[3][3], double V[3][3], double d[3]) {
  double e[3];
  double da[3];
  double dt, dat;
  double vet[3];
  int i, j;
  if (fast_eigen3x3(A, V, d)) {
    return;
  }
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++) {
      V[i][j] = A[i][j];
    }
  }
  tred2(V, d, e);
  tql2(V, d, e);
  da[0] = ((d[0]) > (-d[0]) ? (d[0]) : (-d[0]));
  da[1] = ((d[1]) > (-d[1]) ? (d[1]) : (-d[1]));
  da[2] = ((d[2]) > (-d[2]) ? (d[2]) : (-d[2]));
  if ((da[0] >= da[1]) && (da[0] > da[2])) {
    dt = d[2];
    dat = da[2];
    vet[0] = V[0][2];
    vet[1] = V[1][2];
    vet[2] = V[2][2];
    d[2] = d[0];
    da[2] = da[0];
    V[0][2] = V[0][0];
    V[1][2] = V[1][0];
    V[2][2] = V[2][0];
    d[0] = dt;
    da[0] = dat;
    V[0][0] = vet[0];
    V[1][0] = vet[1];
    V[2][0] = vet[2];
  } else if ((da[1] >= da[0]) && (da[1] > da[2])) {
    dt = d[2];
    dat = da[2];
    vet[0] = V[0][2];
    vet[1] = V[1][2];
    vet[2] = V[2][2];
    d[2] = d[1];
    da[2] = da[1];
    V[0][2] = V[0][1];
    V[1][2] = V[1][1];
    V[2][2] = V[2][1];
    d[1] = dt;
    da[1] = dat;
    V[0][1] = vet[0];
    V[1][1] = vet[1];
    V[2][1] = vet[2];
  }
  if (da[0] > da[1]) {
    dt = d[1];
    dat = da[1];
    vet[0] = V[0][1];
    vet[1] = V[1][1];
    vet[2] = V[2][1];
    d[1] = d[0];
    da[1] = da[0];
    V[0][1] = V[0][0];
    V[1][1] = V[1][0];
    V[2][1] = V[2][0];
    d[0] = dt;
    da[0] = dat;
    V[0][0] = vet[0];
    V[1][0] = vet[1];
    V[2][0] = vet[2];
  }
}
```