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

```asm
<jacobi_decompose>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %rdi,%rbx
  mov    %rsi,0x8(%rsp)
  mov    %rdx,%r15
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  mov    %rdi,%rsi
  mov    $0x1,%edx
  movq   D159(%rip),%xmm2
  jmp    L289
L553:
  add    $0x1,%rax
  cmp    $0x2,%eax
  jg     L284
L322:
  movsd  (%rcx,%rax,8),%xmm0
  andpd  %xmm2,%xmm0
  comisd %xmm1,%xmm0
  jbe    L553
  mov    %eax,0x6c(%rsp,%rdx,4)
  movapd %xmm0,%xmm1
  jmp    L553
L41:
  movsd  D206(%rip),%xmm0
  movsd  %xmm0,(%r15)
  movq   $0x0,0x8(%r15)
  movq   $0x0,0x10(%r15)
  movq   $0x0,0x18(%r15)
  movsd  %xmm0,0x20(%r15)
  movq   $0x0,0x28(%r15)
  movq   $0x0,0x30(%r15)
  movq   $0x0,0x38(%r15)
  movsd  %xmm0,0x40(%r15)
  mov    %rbx,%r8
  mov    $0x0,%edx
  mov    $0x0,%r9d
  pxor   %xmm1,%xmm1
  movapd %xmm1,%xmm0
  mov    0x8(%rsp),%r10
  jmp    L133
L284:
  add    $0x1,%rdx
  add    $0x18,%rsi
L289:
  mov    %edx,0x6c(%rsp,%rdx,4)
  cmp    $0x2,%edx
  jg     L41
  mov    %rsi,%rcx
  mov    %rdx,%rax
  pxor   %xmm1,%xmm1
  jmp    L322
L237:
  cmp    $0x3,%ecx
  je     L466
L48:
  add    $0x1,%rdx
  add    $0x18,%r8
  cmp    $0x3,%rdx
  je     L554
L133:
  mov    %r8,%rdi
  mov    %rdx,%rax
  shl    $0x5,%rax
  movsd  (%rbx,%rax,1),%xmm2
  movsd  %xmm2,(%r10,%rdx,8)
  movl   $0x1,0x7c(%rsp,%rdx,4)
  mov    $0x0,%eax
L519:
  mov    %eax,%esi
  mov    %eax,%ecx
  cmp    %edx,%eax
  je     L163
  ucomisd (%rdi,%rax,8),%xmm1
  jp     L237
  ucomisd (%rdi,%rax,8),%xmm0
  jne    L237
L163:
  lea    0x1(%rsi),%ecx
  add    $0x1,%rax
  cmp    $0x3,%rax
  jne    L519
  jmp    L237
L466:
  sub    $0x1,%r9d
  movl   $0x0,0x7c(%rsp,%rdx,4)
  jmp    L48
L554:
  add    $0x3,%r9d
  mov    %r9d,0x24(%rsp)
  je     L460
  mov    %rbx,%r13
  mov    %r15,0x28(%rsp)
L542:
  movslq 0x74(%rsp),%rax
  movsd  0x18(%r13,%rax,8),%xmm1
  andpd  D159(%rip),%xmm1
  movslq 0x70(%rsp),%rax
  movsd  0x0(%r13,%rax,8),%xmm0
  andpd  D159(%rip),%xmm0
  comisd %xmm0,%xmm1
  seta   %r15b
  movzbl %r15b,%r15d
  seta   %bpl
  movzbl %bpl,%ebp
  mov    0x70(%rsp,%rbp,4),%r14d
  lea    0x0(%rbp,%rbp,2),%rax
  shl    $0x3,%rax
  mov    %rax,0x18(%rsp)
  lea    0x0(%r13,%rax,1),%r12
  movslq %r14d,%rax
  movsd  (%r12,%rax,8),%xmm7
  movsd  %xmm7,0x10(%rsp)
  ucomisd D193(%rip),%xmm7
  jp     L560
  jne    L560
  mov    %r13,%rbx
L460:
  movsd  0x18(%rbx),%xmm0
  movsd  %xmm0,0x8(%rbx)
  movsd  0x30(%rbx),%xmm0
  movsd  %xmm0,0x10(%rbx)
  movsd  0x38(%rbx),%xmm0
  movsd  %xmm0,0x28(%rbx)
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L279
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L560:
  movslq %r14d,%rbx
  mov    0x8(%rsp),%rax
  lea    (%rax,%rbx,8),%rsi
  mov    %rsi,0x38(%rsp)
  lea    0x0(,%rbp,8),%rdi
  mov    %rdi,0x68(%rsp)
  add    %rdi,%rax
  mov    %rax,%rbp
  movsd  (%rax),%xmm6
  movsd  %xmm6,0x50(%rsp)
  movsd  (%rsi),%xmm0
  subsd  %xmm6,%xmm0
  mulsd  D184(%rip),%xmm0
  movsd  %xmm0,0x58(%rsp)
  movapd %xmm0,%xmm5
  andpd  D159(%rip),%xmm5
  movsd  %xmm5,0x30(%rsp)
  fldl   0x30(%rsp)
  fstpt  0x40(%rsp)
  movsd  0x10(%rsp),%xmm2
  movapd %xmm2,%xmm5
  mulsd  %xmm2,%xmm5
  movsd  %xmm5,0x30(%rsp)
  mulsd  %xmm0,%xmm0
  addsd  %xmm5,%xmm0
  movsd  %xmm0,0x60(%rsp)
  fldl   0x60(%rsp)
  fldz
  fucomip %st(1),%st
  ja     L521
  fsqrt
L135:
  fldt   0x40(%rsp)
  faddp  %st,%st(1)
  fstpl  0x40(%rsp)
  movsd  0x40(%rsp),%xmm6
  movapd %xmm6,%xmm0
  mulsd  %xmm6,%xmm0
  addsd  0x30(%rsp),%xmm0
  movsd  %xmm0,0x60(%rsp)
  fldl   0x60(%rsp)
  fldz
  fucomip %st(1),%st
  ja     L494
  fsqrt
L6:
  fstpl  0x60(%rsp)
  movsd  0x60(%rsp),%xmm1
  movsd  0x40(%rsp),%xmm6
  movapd %xmm6,%xmm2
  divsd  %xmm1,%xmm2
  movsd  0x10(%rsp),%xmm0
  divsd  %xmm1,%xmm0
  movsd  0x30(%rsp),%xmm1
  divsd  %xmm6,%xmm1
  pxor   %xmm3,%xmm3
  comisd 0x58(%rsp),%xmm3
  ja     L371
L270:
  movsd  0x50(%rsp),%xmm3
  subsd  %xmm1,%xmm3
  movsd  %xmm3,0x0(%rbp)
  movslq %r15d,%rax
  cmpl   $0x0,0x7c(%rsp,%rax,4)
  je     L487
  movq   D159(%rip),%xmm4
  movapd %xmm1,%xmm5
  andpd  %xmm4,%xmm5
  andpd  %xmm4,%xmm3
  mulsd  D22(%rip),%xmm3
  comisd %xmm5,%xmm3
  jbe    L243
  movl   $0x0,0x7c(%rsp,%rax,4)
  subl   $0x1,0x24(%rsp)
L243:
  mov    0x38(%rsp),%rax
  movapd %xmm1,%xmm3
  addsd  (%rax),%xmm3
  movsd  %xmm3,(%rax)
  movslq %r14d,%rax
  cmpl   $0x0,0x7c(%rsp,%rax,4)
  je     L577
  movq   D159(%rip),%xmm4
  andpd  %xmm4,%xmm1
  andpd  %xmm4,%xmm3
  mulsd  D22(%rip),%xmm3
  comisd %xmm1,%xmm3
  jbe    L489
  movl   $0x0,0x7c(%rsp,%rax,4)
  subl   $0x1,0x24(%rsp)
L489:
  movslq %r14d,%rax
  movq   $0x0,(%r12,%rax,8)
  test   %r15d,%r15d
  jle    L449
  mov    0x68(%rsp),%rbp
  add    %r13,%rbp
  lea    0x70(%rsp),%rdx
  mov    %r13,%rax
  mov    $0x0,%ecx
  movq   D159(%rip),%xmm5
  jmp    L191
L521:
  lea    -0x10(%rsp),%rsp
  fstpt  (%rsp)
  call   <sqrtl@plt>
  add    $0x10,%rsp
  jmp    L135
L494:
  lea    -0x10(%rsp),%rsp
  fstpt  (%rsp)
  call   <sqrtl@plt>
  add    $0x10,%rsp
  jmp    L6
L371:
  movq   D112(%rip),%xmm3
  xorpd  %xmm3,%xmm0
  xorpd  %xmm3,%xmm1
  jmp    L270
L487:
  movq   D159(%rip),%xmm4
  movapd %xmm1,%xmm5
  andpd  %xmm4,%xmm5
  andpd  %xmm4,%xmm3
  mulsd  D22(%rip),%xmm3
  comisd %xmm3,%xmm5
  jbe    L243
  movslq %r15d,%rax
  movl   $0x1,0x7c(%rsp,%rax,4)
  addl   $0x1,0x24(%rsp)
  jmp    L243
L577:
  movq   D159(%rip),%xmm4
  andpd  %xmm4,%xmm1
  andpd  %xmm4,%xmm3
  mulsd  D22(%rip),%xmm3
  comisd %xmm3,%xmm1
  jbe    L489
  movslq %r14d,%rax
  movl   $0x1,0x7c(%rsp,%rax,4)
  addl   $0x1,0x24(%rsp)
  jmp    L489
L301:
  mov    %r8d,(%rdi)
  cmp    $0x2,%ecx
  jle    L444
L422:
  add    $0x1,%ecx
  add    $0x18,%rbp
  add    $0x4,%rdx
  add    $0x18,%rax
  cmp    $0x1,%ecx
  je     L449
L191:
  mov    %rax,%rsi
  movsd  0x0(%rbp),%xmm1
  movsd  (%rax,%rbx,8),%xmm3
  movapd %xmm2,%xmm4
  mulsd  %xmm1,%xmm4
  movapd %xmm0,%xmm6
  mulsd  %xmm3,%xmm6
  subsd  %xmm6,%xmm4
  movsd  %xmm4,0x0(%rbp)
  mulsd  %xmm0,%xmm1
  mulsd  %xmm2,%xmm3
  addsd  %xmm3,%xmm1
  movsd  %xmm1,(%rax,%rbx,8)
  mov    %rdx,%rdi
  movsd  0x0(%rbp),%xmm3
  movapd %xmm3,%xmm4
  andpd  %xmm5,%xmm4
  movslq (%rdx),%r8
  movsd  (%rax,%r8,8),%xmm3
  andpd  %xmm5,%xmm3
  mov    %r15d,%r8d
  comisd %xmm3,%xmm4
  ja     L301
  mov    (%rdx),%r8d
  jmp    L301
L444:
  andpd  D159(%rip),%xmm1
  movslq %r8d,%r8
  movsd  (%rsi,%r8,8),%xmm3
  andpd  D159(%rip),%xmm3
  comisd %xmm3,%xmm1
  jbe    L422
  mov    %r14d,(%rdi)
  jmp    L422
L449:
  lea    0x1(%r15),%eax
  cmp    %eax,%r14d
  jle    L377
  cltq
  mov    0x18(%rsp),%rdi
  lea    0x18(%r13,%rdi,1),%rdx
  movq   D159(%rip),%xmm5
  movslq %r15d,%rcx
  movapd %xmm5,%xmm6
  jmp    L182
L268:
  add    $0x1,%rax
  add    $0x18,%rdx
  cmp    %eax,%r14d
  jle    L439
L182:
  mov    %eax,%edi
  movsd  (%r12,%rax,8),%xmm1
  mov    %rdx,%rsi
  movsd  (%rdx,%rbx,8),%xmm3
  movapd %xmm2,%xmm4
  mulsd  %xmm1,%xmm4
  movapd %xmm0,%xmm7
  mulsd  %xmm3,%xmm7
  subsd  %xmm7,%xmm4
  movsd  %xmm4,(%r12,%rax,8)
  mulsd  %xmm0,%xmm1
  mulsd  %xmm2,%xmm3
  addsd  %xmm3,%xmm1
  movsd  %xmm1,(%rdx,%rbx,8)
  movsd  (%r12,%rax,8),%xmm3
  movapd %xmm3,%xmm4
  andpd  %xmm5,%xmm4
  movslq 0x70(%rsp,%rcx,4),%r8
  movsd  (%r12,%r8,8),%xmm3
  andpd  %xmm5,%xmm3
  comisd %xmm3,%xmm4
  ja     L73
  mov    0x70(%rsp,%rcx,4),%edi
L73:
  mov    %edi,0x70(%rsp,%rcx,4)
  cmp    $0x2,%eax
  jg     L268
  andpd  %xmm6,%xmm1
  movslq 0x70(%rsp,%rax,4),%rdi
  movsd  (%rsi,%rdi,8),%xmm3
  andpd  %xmm6,%xmm3
  comisd %xmm3,%xmm1
  jbe    L268
  mov    %r14d,0x70(%rsp,%rax,4)
  jmp    L268
L377:
  lea    0x1(%r14),%eax
  cmp    $0x2,%eax
  jg     L439
  lea    (%rbx,%rbx,2),%rdx
  lea    0x0(%r13,%rdx,8),%rcx
  cltq
  movq   D159(%rip),%xmm5
  movslq %r15d,%rdx
  movapd %xmm5,%xmm6
  movslq %r14d,%rdi
  jmp    L118
L550:
  add    $0x1,%rax
  cmp    $0x2,%eax
  jg     L439
L118:
  mov    %eax,%esi
  movsd  (%r12,%rax,8),%xmm1
  movsd  (%rcx,%rax,8),%xmm3
  movapd %xmm2,%xmm4
  mulsd  %xmm1,%xmm4
  movapd %xmm0,%xmm7
  mulsd  %xmm3,%xmm7
  subsd  %xmm7,%xmm4
  movsd  %xmm4,(%r12,%rax,8)
  mulsd  %xmm0,%xmm1
  mulsd  %xmm2,%xmm3
  addsd  %xmm3,%xmm1
  movsd  %xmm1,(%rcx,%rax,8)
  movsd  (%r12,%rax,8),%xmm3
  movapd %xmm3,%xmm4
  andpd  %xmm5,%xmm4
  movslq 0x70(%rsp,%rdx,4),%r8
  movsd  (%r12,%r8,8),%xmm3
  andpd  %xmm5,%xmm3
  mov    %eax,%r8d
  comisd %xmm3,%xmm4
  ja     L231
  mov    0x70(%rsp,%rdx,4),%r8d
L231:
  mov    %r8d,0x70(%rsp,%rdx,4)
  cmp    $0x2,%r14d
  jg     L550
  andpd  %xmm6,%xmm1
  movslq 0x70(%rsp,%rdi,4),%r8
  movsd  (%rcx,%r8,8),%xmm3
  andpd  %xmm6,%xmm3
  comisd %xmm3,%xmm1
  jbe    L550
  mov    %esi,0x70(%rsp,%rdi,4)
  jmp    L550
L439:
  mov    0x28(%rsp),%rdi
  mov    %rdi,%rax
  mov    0x18(%rsp),%rsi
  add    %rsi,%rax
  lea    (%rbx,%rbx,2),%rdx
  lea    (%rdi,%rdx,8),%rdx
  lea    0x18(%rdi,%rsi,1),%rcx
L458:
  movsd  (%rax),%xmm1
  movsd  (%rdx),%xmm3
  movapd %xmm2,%xmm4
  mulsd  %xmm1,%xmm4
  movapd %xmm0,%xmm5
  mulsd  %xmm3,%xmm5
  subsd  %xmm5,%xmm4
  movsd  %xmm4,(%rax)
  mulsd  %xmm0,%xmm1
  mulsd  %xmm2,%xmm3
  addsd  %xmm3,%xmm1
  movsd  %xmm1,(%rdx)
  add    $0x8,%rax
  add    $0x8,%rdx
  cmp    %rax,%rcx
  jne    L458
  cmpl   $0x0,0x24(%rsp)
  jne    L542
  mov    %r13,%rbx
  jmp    L460
L279:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: data_label: D159
data_type: qword[2]
name: unpack_data
arguments: data_label: D206
data_type: byte[8]
name: unpack_data
arguments: data_label: D193
data_type: byte[8]
name: unpack_data
arguments: data_label: D184
data_type: f64
name: unpack_data
arguments: data_label: D22
data_type: byte[8]
name: unpack_data
arguments: data_label: D112
data_type: byte[8]

tool: {"D159": [0x7fffffffffffffff,0x0000000000000000]}

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

tool: {"D193": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: D184: 0.5

tool: {"D22": [0x8d,0xed,0xb5,0xa0,0xf7,0xc6,0xb0,0x3e]}

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

assistant: ```c
void jacobi_decompose(double cov_matrix[][3], double *eigenvalues, double orth_matrix[][3]) {
  int i, j, k, l;
  int max_col[3];
  int changed[3];
  int n = 3;
  int max_row;
  int state = 0;
  double max, c, s, t, u, a;
  int count = 0;
  for (i = 0; i < n; i++) {
    max = 0;
    max_col[i] = i + 1;
    for (j = i + 1; j < n; j++) {
      if (fabs(cov_matrix[i][j]) > max) {
        max_col[i] = j;
        max = fabs(cov_matrix[i][j]);
      }
    }
  }
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      orth_matrix[i][j] = (i == j) ? 1 : 0;
  for (i = 0; i < n; i++) {
    eigenvalues[i] = cov_matrix[i][i];
    changed[i] = 1;
    for (j = 0; j < n; j++)
      if (j != i && cov_matrix[i][j])
        break;
    if (j == n) {
      state--;
      changed[i] = 0;
    }
  }
  state += n;
  while (state) {
    count++;
    max = fabs(cov_matrix[0][max_col[0]]);
    max_row = 0;
    for (i = 1; i < n - 1; i++) {
      if (fabs(cov_matrix[i][max_col[i]]) > max) {
        max = fabs(cov_matrix[i][max_col[i]]);
        max_row = i;
      }
    }
    k = max_row;
    l = max_col[k];
    max = cov_matrix[k][l];
    if (max == 0)
      break;
    a = (eigenvalues[l] - eigenvalues[k]) * 0.5;
    t = fabsl(a) + sqrtl(max * max + a * a);
    s = sqrtl(max * max + t * t);
    c = t / s;
    s = max / s;
    t = max * max / t;
    if (a < 0) {
      s = -s;
      t = -t;
    }
    a = eigenvalues[k];
    eigenvalues[k] += -t;
    if (changed[k] && (fabs(-t) < 1e-6 * fabs(eigenvalues[k]))) {
      changed[k] = 0;
      state--;
    } else if (!changed[k] && (fabs(-t) > 1e-6 * fabs(eigenvalues[k]))) {
      changed[k] = 1;
      state++;
    };
    a = eigenvalues[l];
    eigenvalues[l] += t;
    if (changed[l] && (fabs(t) < 1e-6 * fabs(eigenvalues[l]))) {
      changed[l] = 0;
      state--;
    } else if (!changed[l] && (fabs(t) > 1e-6 * fabs(eigenvalues[l]))) {
      changed[l] = 1;
      state++;
    };
    cov_matrix[k][l] = 0;
    for (i = 0; i < k; i++) {
      t = cov_matrix[i][k];
      u = cov_matrix[i][l];
      cov_matrix[i][k] = t * c - s * u;
      cov_matrix[i][l] = s * t + c * u;
      if (1) {
        if (fabs(cov_matrix[i][k]) > fabs(cov_matrix[i][max_col[i]]))
          max_col[i] = k;
        if (i < 3 && fabs(cov_matrix[i][l]) > fabs(cov_matrix[i][max_col[i]]))
          max_col[i] = l;
      };
    }
    for (i = k + 1; i < l; i++) {
      t = cov_matrix[k][i];
      u = cov_matrix[i][l];
      cov_matrix[k][i] = t * c - s * u;
      cov_matrix[i][l] = s * t + c * u;
      if (1) {
        if (fabs(cov_matrix[k][i]) > fabs(cov_matrix[k][max_col[k]]))
          max_col[k] = i;
        if (i < 3 && fabs(cov_matrix[i][l]) > fabs(cov_matrix[i][max_col[i]]))
          max_col[i] = l;
      };
    }
    for (i = l + 1; i < n; i++) {
      t = cov_matrix[k][i];
      u = cov_matrix[l][i];
      cov_matrix[k][i] = t * c - s * u;
      cov_matrix[l][i] = s * t + c * u;
      if (1) {
        if (fabs(cov_matrix[k][i]) > fabs(cov_matrix[k][max_col[k]]))
          max_col[k] = i;
        if (l < 3 && fabs(cov_matrix[l][i]) > fabs(cov_matrix[l][max_col[l]]))
          max_col[l] = i;
      };
    }
    for (i = 0; i < n; i++) {
      t = orth_matrix[k][i];
      u = orth_matrix[l][i];
      orth_matrix[k][i] = t * c - s * u;
      orth_matrix[l][i] = s * t + c * u;
      if (0) {
        if (fabs(orth_matrix[k][i]) > fabs(orth_matrix[k][max_col[k]]))
          max_col[k] = i;
        if (l < 3 && fabs(orth_matrix[l][i]) > fabs(orth_matrix[l][max_col[l]]))
          max_col[l] = i;
      };
    }
  }
  for (k = 0; k < n - 1; k++) {
    for (l = k + 1; l < n; l++) {
      cov_matrix[k][l] = cov_matrix[l][k];
    }
  }
}
```